在编译器之间读取和写入原始对象到磁盘(istream)
Reading and writing raw object to disk (istream) across compilers
我一直在移植一些旧的遗留代码。它已经有15年的历史了,曾经使用一些旧的Borland编译器进行编译。由于缺少依赖项/编译器,我们无法编译旧代码。
我们有这样的东西:
class SegmentParameterDataRecord
{
private:
int32_t parameterId;
double value;
public:
SegmentParameterDataRecord() : parameterId(0), value(0.0) {}
int32_t & getParameterId() { return parameterId; }
double & getValue() { return value; }
void read(std::istream & in);
void write(std::ostream & out);
};
注意read
和write
方法。它们在这里:
void SegmentParameterDataRecord::read(std::istream & in)
{
in.read((char *) this, sizeof(*this));
}
void SegmentParameterDataRecord::write(std::ostream & out)
{
out.write((char *) this, sizeof(*this));
}
这给我带来了一些担忧。请注意,旧代码转换为char *
,并将数据作为内存的原始字节进行处理。我相信当我把这个代码移植到最新的MinGW时,我遇到了问题。
1) 是否可能SegmentParameterDataRecord
的内部内存表示在不同的编译器中是不同的,因此在一个编译器(15岁的Borland)上write
和SegmentParameterDataRecord
,然后在另一个编译器上read
(最近的MinGW)会有问题?
2) sizeof(SegmentParameterDataRecord)
可能与15年前的Borland编译器不同于今天的MinGW吗?
3) 这种可能性有多大?
sizeof(SegmentParameterDataRecord)可能与15年前的Borland编译器和今天的MinGW不同吗?
这绝对是可能的。事实上,sizeof(int)
在编译器和机器之间可能有所不同。例如,在32位机器上,sizeof(int)
通常是4个字节,但在64位机器上sizeof(int)
可以是8个字节。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 防止临时对象文件访问 MSVC 中的磁盘
- 通过C++与fst将对象写入R中的磁盘
- 在磁盘上/从磁盘存储/加载C++对象
- 在编译器之间读取和写入原始对象到磁盘(istream)
- 如何正确删除从磁盘读取的FlatBuffer对象