2012-07-18 73 views
3

考慮下面的C++代碼,打印用於double對齊要求,並將double類型的結構構件的有效對準:gcc爲什麼不遵守對齊要求?

#include <iostream> 

struct S { short x; double y; }; 

int main() { 
    S s; 
    std::cout << __alignof(double) << ' '; 
    std::cout << (char*)&s.y - (char*)&s << std::endl; 
} 

Run on codepag.org

我上編譯該代碼用gcc 86。

我期待這個程序輸出8 8,但是它打印8 4來代替。 這是爲什麼?

回答

2

對象的對齊可以在結構的外部和內部不同。在結構之外,它可能是允許最快訪問的最小對齊(例如8字節)。但是在結構內部,它可能是需要最少填充的一些值(x86上的4個字節)。有些編譯器允許你控制結構包裝(GCC:__attribute__((pack)),微軟:#pragma pack()

完全編譯器做什麼,它通過系統的ABI確定。如果ABI表示結構值沒有比四個字節更大的填充,那麼編譯器將符合這一點。

+0

有道理,謝謝! – 2012-07-18 16:58:02

+0

這個奇怪的行爲的原因在這裏解釋:http://www.wambold.com/Martin/writings/alignof.html在「關於對齊的驚人事實」一節。 – 2012-07-18 21:03:48