2017-06-22 52 views
0

我有兩個CPU。一個32位和另一個64位。我們有如下所示的片的C++代碼:C++爲32位和64位處理器強制執行對齊的安全

typedef std::bitset<16> MyBits; 

typedef struct t_MyStruct_16 { 
    uint32_t first; 
    int16_t second; 
    __attribute__((__aligned__(8))) MyBits st; 
} MyStruct_16; 

typedef struct t_MyStruct_12 { 
    uint32_t first; 
    int16_t second; 
    MyBits st; 
} MyStruct_12; 

它是安全的使用sizeof來計算結構的尺寸爲兩個處理器32和64位ΣΔ如果我進行比特式操作,那麼填充的東西是否會影響代碼的行爲?

謝謝。

+1

你什麼意思是安全的?它不會殺了你。 – stark

+0

我在說,如果我舉個例子,從這個bitset st計算出一個Hash,我會得到32和64位的不同結果,還是我會得到相同的結果? – Yore

+0

'sizeof'包含如果您創建對象類型的數組將添加的填充。 – stark

回答

1

在C++中,總是添加填充以滿足數據成員的對齊要求。所以這個問題可以改寫爲:「對於32位和64位構建,」是alignof(T)?「

一般來說,答案是否定的。用gcc7(linux)編譯你的例子,我得到alignof(MyBits)在64位版本上等於8,在32位版本上爲4。

由於POD結構的排列是一樣的最高對準部件的排列,並sizeof(T)必須總是alignof(T)多,你得到的sizeof(MyStruct_12)是16對64位版本,而不是12的

可能的解決方案是強制對齊(使用alignof或)在每個單個成員上。

如果您使用的是gcc,更簡單的解決方案是使用帶有強制對齊值的#pragma pack(push)。例如:

#pragma pack (push, 4) 
typedef std::bitset<16> MyBits; 

typedef struct t_MyStruct_16 { 
    uint32_t first; 
    int16_t second; 
    MyBits st; 
} MyStruct_16; 

typedef struct t_MyStruct_12 { 
    uint32_t first; 
    int16_t second; 
    MyBits st; 
} MyStruct_12; 

#pragma pack(pop) 

這迫使每一構件上4的最大對齊,這應該在32位和64位的構建工作。

+0

非常感謝。這就是我需要的。 – Yore