我一直在移植一些旧的旧代码。它已经15岁了,并且曾经用一些旧的Borland编译器进行编译。由于缺少依赖/编译器,我们无法编译旧代码。跨编译器读取和写入原始对象到磁盘(istream)
我们有这样的事情:
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)这种可能性有多大?
我推测这是一个16位编译器,因为结构中有大量未使用的空间。如果准确,你应该可以用__attribute __((packed))来拯救它。仔细比较旧编译器和新编译器的sizeof(SegmentParameterDataRecord)。您需要相同的价值才能拯救数据。 – 2014-10-04 01:00:49
@HansPassant未使用的空间是什么意思? – 0x499602D2 2014-10-04 01:04:05
也很好奇什么汉斯意味着未使用的空间。不过,我可以证实,二进制文件出现(不确定)比G ++占用更多的空间。这是基于分析二进制的预感。 – 2014-10-04 01:09:52