例如,如果我有一个名为 Obj
的类和一个名为 obj1
的 Obj
。当我想用 reinterpret_cast
写入二进制文件时,我以二进制模式打开该文件,然后,
outstream.write( reinterpret_cast<const char *>(&obj1), sizeof(obj1) )
其中 outstream 是一个 ifstream。
当我想从那个文件中读取时,
instream.read( reinterpret_cast<char *>(&obj1), sizeof(obj1) )
发生了什么。它以二进制读取 obj1
的表示并转换为 obj1
或它是如何工作的。当我写的时候我明白它解释 obj1
一个字节但是当我读的时候我不明白发生了什么。
最佳答案
当您将指向对象的指针重新解释为指向char
的指针时,您将写入对象本身的内存表示。这包括
- 对象内部的所有指针。对于具有虚拟成员的类,这可能包括指向 vtable 的指针,具体取决于实现
- 成员之间的所有填充,
- 所有数据成员,以您的硬件字节序排列。
此写入不包括指针指向的对象的任何部分。
而且,当你将一个带有指针的对象读回内存时,这些指针中的值将是垃圾。如果取消引用其中的任何一个,就会出现未定义的行为。
这使得该技术仅适用于普通旧数据 (POD) 对象,即原语和由原语和其他 POD 对象组成的结构/类。此外,当您需要跨硬件兼容性时,该技术不适用。
关于c++ - 使用 reinterpreter_cast 读写二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32668167/