union 型別 記憶體對齊

2021-09-30 04:26:00 字數 1726 閱讀 3151

uniondate;date max;cout<<sizeof(max) <<endl;

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

摘幾句the c programming language裡面講述這個問題的原話,以說明讀書還是必要的:

①聯合就是乙個結構,②它的所有成員相對於基位址的偏移量都為0,③此結構空間要大到足夠容納最「寬」的成員,④並且,其對齊方式要適合於聯合中所有型別的成員。

怕有的兄弟還不明白,特附圖乙個幫助理解:

char a;

=>

xint i[5];

=>x

x x

x x

x double b;

=>x

該結構要放得下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中的例子作答)

typedeflongalign;unionheaders;align x;

}

這裡的align有什麼用?作用只有乙個,就是強迫分配的結構體按long的長度對齊。

對齊是按照低位址對齊的,

低位址---------------------->高位址

char a;

=>

xint i[5];

=>x

x x

x x

x double b;

=>x

uniondate

;

date max;

max.a = 0x12;

printf(「0x%x/n」,max.i[0]);

printf(「0x%x/n」,max.i[1]);

輸出為: 0xcccccc12

0xcccccccc

C struct記憶體對齊 union的大端小端

系統禁止編譯器在乙個結構的起始位置跳過幾個位元組來滿足邊界對齊要求,因此所有結構的起始儲存位置必須是結構中邊界要求最嚴格的資料型別所要求的位置。如某個機器的整型長度為4個位元組且它的起始儲存位置能夠被4整除,那麼結構體 struct allgn 在記憶體中的儲存的起始位置必須是乙個能夠被4整除的位址...

C struct和union 記憶體位元組對齊問題

資料成員對齊規則 結構 struct 或聯合 union 的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始 比如int在 位機為 位元組,則要從 的整數倍位址開始儲存。結構體作為成員 如果乙個結構裡有某些結構體成員,則結構體成員要從其內部...

C struct和union 記憶體位元組對齊問題

資料成員對齊規則 結構 struct 或聯合 union 的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始 比如int在 位機為 位元組,則要從 的整數倍位址開始儲存。結構體作為成員 如果乙個結構裡有某些結構體成員,則結構體成員要從其內部...