2014-10-04 53 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