2010-08-24 21 views
0

完全公開 - 這是家庭作業,雖然已完成且完全可行,但我正在尋找更好的解決方案。序列化二進制結構gcc vs cl

我有一個二進制文件,它是由Visual Studio中編譯的程序創建的(我相信)。結構看起來像這樣。

 
struct Record { 
    char c; 
    double d; 
    time_t t; 
}; 

在Windows上這種結構與Visual Studio 2008的大小給予24個字節。 1 + 8 + 8 = 24。所以有一些填充正在進行。 Linux和gcc上的相同結構提供16個字節。 1 + 8 + 4 = 16。爲了排列起來,我添加了一些填充並將time_t更改爲另一種類型。那麼我的結構看起來像這樣。

 
struct Record { 
    char c; 
    char __padding[7]; 
    double d; 
    long long t; 
}; 

這現在可以工作,gcc給它的大小爲24字節,但它似乎有點骯髒。所以有兩個問題。

爲什麼這兩種編譯器的實現方式不同?

是否有任何__attribute__ ((aligned))類型的選項或任何其他更清潔的解決方案呢?

+0

你在gcc中使用「-malign-double」嗎?閱讀:http://stackoverflow.com/questions/2457182/c-malign-double-compiler-flag – 2010-08-24 14:38:10

回答

1

不同之處在於默認情況下我們是32bit對齊雙打還是64bit對齊雙打。在32位機器上,在64位邊界上具有雙精度可能有一些好處,但可能不是很大。那麼VC可能比gcc更小心。

botton的一句話是,如果你使用序列化的結構,你應該總是把它們打包(即8位對齊),然後手動對齊。這樣你的代碼肯定能夠跨平臺兼容。