c++ - 一个类的大小
ringa_lee
ringa_lee 2017-04-17 12:02:23
0
2
812
class A
{
    double a;
    short b;
    int c;
    char d;
}

请问sizeof(A)的大小是多少?对齐的原则是什么

ringa_lee
ringa_lee

ringa_lee

全部回覆(2)
阿神

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
{

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.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倍數。爪機沒試驗

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板