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

时间:2014-10-04 00:45:02

标签: c++

我已经移植了一些旧的遗留代码。它已有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的内部存储器表示是否可能在编译器之间有所不同,因此write SegmentParameterDataRecord在一个编译器(15岁)上会出现问题Borland)然后read在另一个编译器(最近的MinGW)上?

2)sizeof(SegmentParameterDataRecord)是否可能与15岁的Borland编译器与今天的MinGW不同?

3)这种可能性有多大?

1 个答案:

答案 0 :(得分:1)

  

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

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