我一直在移植一些舊的舊代碼。它已經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