我已经移植了一些旧的遗留代码。它已有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
的内部存储器表示是否可能在编译器之间有所不同,因此write
SegmentParameterDataRecord
在一个编译器(15岁)上会出现问题Borland)然后read
在另一个编译器(最近的MinGW)上?
2)sizeof(SegmentParameterDataRecord)
是否可能与15岁的Borland编译器与今天的MinGW不同?
3)这种可能性有多大?
答案 0 :(得分:1)
sizeof(SegmentParameterDataRecord)是否可能与15年前的Borland编译器与今天的MinGW不同?
这绝对是可能的。事实上,sizeof(int)
可以在编译器和机器之间有所不同。例如,在32位计算机上,sizeof(int)
通常为4个字节,但在64位计算机上,sizeof(int)
可以是8个字节。