聯合體,位域, 結構體對齊

2021-07-31 17:54:02 字數 1454 閱讀 8658

聯合體union

當多個資料需要共享記憶體或者多個資料每次只取其一時,可以利用聯合體(union)。在c programming language 一書中對於聯合體是這麼描述的:

1)聯合體是乙個結構;

2)它的所有成員相對於基位址的偏移量都為0;

3)此結構空間要大到足夠容納最"寬"的成員;

1下面解釋這四條描述:

由於聯合體中的所有成員是共享一段記憶體的,因此每個成員的存放首位址相對於於聯合體變數的基位址的偏移量為0,即所有成員的首位址都是一樣的。為了使得所有成員能夠共享一段記憶體,因此該空間必須足夠容納這些成員中最寬的成員。對於這句「對齊方式要適合其中所有的成員」是指其必須符合所有成員的自身對齊方式。

聯合體中儲存結構體,對齊按照結構體中最大對齊數對齊

位域

使用位域的主要目的是壓縮儲存,其大致規則為:

1) 如果相鄰位域字段的型別相同,且其位寬之和小於型別的sizeof大小,則後面的字段將緊鄰前乙個字段儲存,直到不能容納為止;

2) 如果相鄰位域字段的型別相同,但其位寬之和大於型別的sizeof大小,則後面的字段將從新的儲存單元開始,其偏移量為其型別大小的整數倍;

3) 如果相鄰的位域字段的型別不同,則各編譯器的具體實現有差異,vc6採取不壓縮方式,dev-c++採取壓縮方式;

從測試上來看, vs2013,是從下乙個型別位址長度處開始

4) 如果位域字段之間穿插著非位域字段,則不進行壓縮;

5).結構體總大小為最大對齊數的整數倍。

整體來看,位域的對齊方式和struct還是比較相似的。

結構體

對齊原因

1、平台原因(移植原因):

不是所有的硬體平台都能訪問任意位址上的任意資料的;

某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。

2、效能原因:資料結構(尤其是棧)應該盡可能地在自然邊界上對齊。

原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問。

結構體內存對其規則:

1.第乙個成員在與結構體變數偏移量為0的位址處。

2.其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。

//對齊數 = 編譯器預設的乙個對齊數 與 該成員大小的較小值。

vs中預設的值為8

linux中的預設值為4

3.結構體總大小為最大對齊數(每個成員變數除了第乙個成員都有乙個對齊數)的整數倍。

4.如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的

整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體的對

齊數)的整數倍。

其他:指定對齊值:#pragma pack (value)時的指定對齊值value。

#pragma pack () /*取消指定對齊,恢復預設對齊*/

聯合體 位域結構體 聯合體的妙用

在c語言中,變數的定義是分配儲存空間的過程。一般的,每個變數都具有其獨有的儲存空間,那麼可不可以在同乙個記憶體空間中儲存不同的資料型別 不是同事儲存 呢?答案是可以的,使用聯合體就可以達到這樣的目的。聯合體也叫共用體,在c語言中定義聯合體的關鍵字是union。定義乙個聯合型別的一般形式為 union...

記憶體對齊問題(結構體,聯合體,位段)

結構體 typedef struct a a typedef struct b b typedef struct c c 對於結構體a,b,c.它們具有同樣的結構體成員,只是調換了先後順序,我們來觀察它們的大小是否相同?結果顯示在sizeof計算結構體大小時,經常得到的值比結構體成員所佔記憶體總和要...

聯合體 位域結構體 C C 中的位域

各種基本資料型別中,長度最小的 char 和 bool 在記憶體中占用乙個位元組的空間,但對於某些資料型別只需要幾個二進位制位即可儲存,例如 enum gameresult 由於它只有四種取值,只需要兩個二進位制位就可儲存,而乙個 gameresult 型別變數至少要佔1個位元組 8個二進位制位 在...