在编译器之间读取和写入原始对象到磁盘(istream)

Reading and writing raw object to disk (istream) across compilers

本文关键字:对象 磁盘 istream 原始 之间 编译器 读取      更新时间:2023-10-16

我一直在移植一些旧的遗留代码。它已经有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);
};

注意readwrite方法。它们在这里:

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)上writeSegmentParameterDataRecord,然后在另一个编译器上read(最近的MinGW)会有问题?

2) sizeof(SegmentParameterDataRecord)可能与15年前的Borland编译器不同于今天的MinGW吗?

3) 这种可能性有多大?

sizeof(SegmentParameterDataRecord)可能与15年前的Borland编译器和今天的MinGW不同吗?

这绝对是可能的。事实上,sizeof(int)在编译器和机器之间可能有所不同。例如,在32位机器上,sizeof(int)通常是4个字节,但在64位机器上sizeof(int)可以是8个字节。