Foo program[] {...};
ofstream ofs{file_path, std::ios::binary};
if (ofs) {
ofs.write(reinterpret_cast<char*>(program), sizeof(program));
ofs.close();
}
我见过使用
reinterpret_cast<char*>
写入这样的文件的示例。这是不好的用法吗?
据我所知,结果指针不能保证位于相同的内存地址,但由于我们没有使用结果指针,它仍然是不好的风格吗?
据我所知,结果指针不能保证位于相同的内存地址
指针保证与
program
的地址表示相同的地址,并且保证指向program
。
虽然目前存在一些技术问题,意味着通过此指针进行的“访问”尚未明确定义,但这在实践中没有相关性。该行为与实践中的预期完全一致:
ofs.write(reinterpret_cast<char*>(program), sizeof(program));
会将
program
的对象表示写入流中。
这个问题不是未定义的行为或类似的问题,而是语义:将对象的对象表示写入文件通常是一个坏主意,因为当您尝试读回它时,只有当系统/读回它的程序使用完全相同的类型表示(例如字节顺序)和完全相同的类布局(例如可以依赖于 ABI)。通过为每个值定义固定的独立于系统的文件格式和表示形式,然后根据该协议写入每个
值(而不是对象表示),将对象正确序列化到文件中几乎总是一种更安全的方法进入文件。