2014-10-04 64 views
1

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

注意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内部存储器表示是跨编译器不同,因此这将是有问题的writeSegmentParameterDataRecord一个编译器(15岁Borland公司),然后read它在另一个编译器(最近MinGW的)?

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

3)这种可能性有多大?

+0

我推测这是一个16位编译器,因为结构中有大量未使用的空间。如果准确,你应该可以用__attribute __((packed))来拯救它。仔细比较旧编译器和新编译器的sizeof(SegmentParameterDataRecord)。您需要相同的价值才能拯救数据。 – 2014-10-04 01:00:49

+0

@HansPassant未使用的空间是什么意思? – 0x499602D2 2014-10-04 01:04:05

+0

也很好奇什么汉斯意味着未使用的空间。不过,我可以证实,二进制文件出现(不确定)比G ++占用更多的空间。这是基于分析二进制的预感。 – 2014-10-04 01:09:52

回答

1

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

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

+0

我们通过用'int32_t'和'unsigned int'和'unsigned long'用'uint32_t'替换'int'和'long'来模拟原始的C++实现。所以从这个角度来看,新代码现在应该具有与原始实现中看到的相同的原始大小。 – 2014-10-04 00:52:14

+0

在Windows 64位上,'sizeof(int)'仍然是4. – 2014-10-04 01:16:41

+0

@RemyLebeau这就是为什么我符合“可以”的原因。 – 2014-10-04 03:19:26