2012-04-24 74 views
2

有沒有一種方法可以編譯器標誌來創建一個基類和派生類相同的內存佈局在msvc相比,其等價的gcc?即時通訊使用VS2010並比較它以GCC 4.1.1GCC VS MSVC類打包和對齊

所以

#if define _MSVC 
// window 
DALIGN(A,B) __declspec(align(A)) B 
#else 
// GCC 
DALIGN(A,B) B __attribute__((aligned(A))) 
#endif 
class A 
{ 
    DALIGN(CVector V,16); 
    int a; 
} 
class B : public A 
{ 
    int b; 
} 

A爲16字節對齊使其0X20(32) B也是16字節對齊的,但要麼是0x20的也(32)上海灣合作委員會,但在msvc它是0x30(48)

有沒有辦法強制msvc打包數據像GCC是?

原因:我創建數據並將其直接加載到不同平臺上的類中。如果我可以在兩個平臺上使用完全相同的數據佈局,那真的會更好。 (在兩個平臺上,endian都是一樣的)

+0

不要依靠包裝來做到這一點。使用序列化創建該類的平臺無關表示。 – 2012-04-24 17:42:54

+0

這就是我正在做的,我有一個工具可以導出序列化的數據,問題是兩個編譯器之間數據的對齊/放置是不同的。因此數據不能共享。這是在另外兩個平臺上工作(已經有多年了),但我只是添加了MSVC(窗口),並打破了這種數據錯位的測試。 – vbbartlett 2012-04-24 18:02:45

+0

您不能僅從&X轉儲X的內容,並期望它是可檢索的。請參閱http://www.boost.org/doc/libs/1_49_0/libs/serialization/doc/index.html上的Boost.Serialization。作爲一種樂隊幫助,您可能會添加額外的字段以在Windows上獲得填充權限,以使這些結構對齊方式正確地讀回,但這很脆弱並且不可擴展。 – 2012-04-24 18:05:16

回答

2

圍繞類A和類B添加#pragma pack(push,4)/ #pragma pack(pop) ,因爲GCC將它對齊成功。

請注意,如果繼承被擴展,那麼對於任何需要對齊的類似乎都是如此,並且通過繼承轉發都需要打包。 實例類別A,B,C,D,E,F C具有對齊的成員 C,D,E,F都需要它們周圍的包。