class A { double a; short b; int c; char d; }
请问sizeof(A)的大小是多少?对齐的原则是什么
ringa_lee
sizeof(A)==24
double a: sizeof(double) == 8short b 本來佔2,因為後面int c佔4,它要跟c對齊,b也變成佔4, (b和c加起來剛好佔8,與佔用最長的double a剛好對齊)char d與最大的double a對齊佔8。
所以了解了對齊的一些原則後,可以透過調整成員的聲明順序來節省空間,例如把A改成:class A{
double a; char d; short b; int c;
};sizeof(A) == 16,因為d跟b對齊,佔2,而d(2) + b(2) + c(4)剛好為8,對齊a,所以剛好佔用了16,對前一種定義少了8。
關於「資料結構對齊」的原則,不是三言兩語就能表述清楚的,你可以用「C Data structure alignment」或「C Data structure padding」搜尋一下,會有一大堆的文章出來。
補充說明:以上說的是通常情況下(即不修改編譯器編譯行為的情況)的對齊方式,但也可以告訴編譯器使用多少個位元組來進行對齊,例如在A聲明前面加上一句:
#pragma pack(4)
這樣會讓編譯器以4位元組,而不是結構中的佔用最長的成員(double a)進行對齊,如果以4位元組的方式來對齊的話,sizeof(A) == 20。
對於gcc編譯器,也可以用
__attribute((aligned (n)))
來設定按n位元組對齊。
如果你原題所在的機器上沒有開啟這兩個設置,那可能你的編譯器就是預設使用4位元組對齊的,你驗證一下。
參考連結:http://www.cnblogs.com/graphics/archive/2010/08/12/1797953.htmlhttp://blog.csdn.net/edonlii/article/details /12748903
不同編譯環境的對齊方式略有不同,g++常用的規則是成員偏移必須整除自身大小,double大小8,偏移0沒問題,short大小2偏移8,int大小4,如果偏移10就不對了,故c的偏移是12,接下來short大小1偏移16,這樣一共是17字節,考慮到32位元機器單次處理4字節,於是補3個字節湊成20位元組為4倍數。估計64位元就是24位元組湊8倍數。爪機沒試驗
sizeof(A)==24
double a: sizeof(double) == 8
short b 本來佔2,因為後面int c佔4,它要跟c對齊,b也變成佔4, (b和c加起來剛好佔8,與佔用最長的double a剛好對齊)
char d與最大的double a對齊佔8。
所以了解了對齊的一些原則後,可以透過調整成員的聲明順序來節省空間,例如把A改成:
class A
{
};
sizeof(A) == 16,因為
d跟b對齊,佔2,而d(2) + b(2) + c(4)剛好為8,對齊a,所以剛好佔用了16,對前一種定義少了8。
關於「資料結構對齊」的原則,不是三言兩語就能表述清楚的,你可以用「C Data structure alignment」或「C Data structure padding」搜尋一下,會有一大堆的文章出來。
補充說明:
以上說的是通常情況下(即不修改編譯器編譯行為的情況)的對齊方式,但也可以告訴編譯器使用多少個位元組來進行對齊,例如在A聲明前面加上一句:
這樣會讓編譯器以4位元組,而不是結構中的佔用最長的成員(double a)進行對齊,如果以4位元組的方式來對齊的話,sizeof(A) == 20。
對於gcc編譯器,也可以用
來設定按n位元組對齊。
如果你原題所在的機器上沒有開啟這兩個設置,那可能你的編譯器就是預設使用4位元組對齊的,你驗證一下。
參考連結:
http://www.cnblogs.com/graphics/archive/2010/08/12/1797953.html
http://blog.csdn.net/edonlii/article/details /12748903
不同編譯環境的對齊方式略有不同,g++常用的規則是成員偏移必須整除自身大小,double大小8,偏移0沒問題,short大小2偏移8,int大小4,如果偏移10就不對了,故c的偏移是12,接下來short大小1偏移16,這樣一共是17字節,考慮到32位元機器單次處理4字節,於是補3個字節湊成20位元組為4倍數。估計64位元就是24位元組湊8倍數。爪機沒試驗