首頁  >  問答  >  主體

c++ - 一个类的大小

class A
{
    double a;
    short b;
    int c;
    char d;
}

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

ringa_leeringa_lee2714 天前771

全部回覆(2)我來回復

  • 阿神

    阿神2017-04-17 12:04:23

    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

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 12:04:23

    不同編譯環境的對齊方式略有不同,g++常用的規則是成員偏移必須整除自身大小,double大小8,偏移0沒問題,short大小2偏移8,int大小4,如果偏移10就不對了,故c的偏移是12,接下來short大小1偏移16,這樣一共是17字節,考慮到32位元機器單次處理4字節,於是補3個字節湊成20位元組為4倍數。估計64位元就是24位元組湊8倍數。爪機沒試驗

    回覆
    0
  • 取消回覆