1. 程式人生 > >union共用體的對齊

union共用體的對齊

long 空間 clas signed lan 地址 結構 bubuko win

union DATE
{
    char a;
    int i[5];
    double b;
};

DATE max;

cout<< sizeof(max) << endl;

這個問題很好回答,並且我把這個問題歸結於基本概念題(就是入門書必須介紹的)。我想一般來說,做過內存管理的,對這個語言特性肯定不會陌生。

摘幾句The C Programming Language裏面講述這個問題的原話,以說明讀書還是必要的:
①聯合就是一個結構,②它的所有成員相對於基地址的偏移量都為0,③此結構空間要大到足夠容納最“寬”的成員,④並且,其對齊方式要適合於聯合中所有類型的成員。

技術分享圖片

該結構要放得下int i[5]必須要至少占4×5=20個字節。如果沒有double的話20個字節夠用了,此時按4字節對齊。但是加入了double就必須考慮double的對齊方式,double是按照8字節對齊的,所以必須添加4個字節使其滿足8×3=24,也就是必須也是8的倍數,這樣一來就出來了24這個數字。綜上所述,最終聯合體的最小的size也要是所包含的所有類型的基本長度的最小公倍數才行。(這裏的字節數均指winnt下的值,平臺、編譯器不同值也有可能不同。)

聯合在存儲分配的時候用的機會最多,因為很少有像存儲分配這樣需要給多種不同類型的變量分配空間而又打算盡可能的節約內存的,這很適合聯合的特性。上述對齊的方式有個很有趣的用法也就常在存儲分配裏面使用。(下面依舊用The C Programming Language中的例子作答)

typedef long Align;

union header {
    struct {
        union header *ptr;
        unsigned size;
    } s;
    Align x;
}

這裏的Align有什麽用?作用只有一個,就是強迫分配的結構體按long的長度對齊。

union共用體的對齊