關於Union和Struct對齊

2021-06-21 08:07:44 字數 978 閱讀 8472

關於union,struct,還有機器數賦值,總是感覺自己認識不是特別深刻,這裡使用小demo程式加以說明,具體的詳細細節描述其它地方已經有說明和記錄,這裡不再說明。

#include union myun 

u; int k;

}a;

int main()

output:

size is 12

0  5  6

說明:int 此linux環境下占用4位元組,結構體a.u本身已經位元組對齊,不需要 padding。union物件內部各成員是共用記憶體,所以 a.k = 0; 修改了 a.u結構體x區域所指向記憶體的值。

修改**:

union myun 

u; int k;

}a;

int main()

output:

size is 12

0  5  6

說明:注意紅色部分,思考為什麼 size is 12。實際上,y 前面做了 3 byte 的padding。

修改**:

union myun 

u; int k;

}a;

int main()

output:

size is 8

-1  -1  6

說明:注意紅色部分,思考為什麼 size is 8。實際上,x 前面做了 2 byte 的padding。

至於為什麼 a.u.x  = -1, a.u.y = -1; 實際上,a.k = 0xffff,從機器碼的角度看 a.u.x 和 a.u.y 記憶體空間上是全 1,然後我們進行補碼翻譯,翻譯成原碼,得到其值 -1。這裡注意機器表示是用補碼表示,最後值的解釋如果能夠翻譯成原碼用原碼解釋,實際上就是機器數(帶有符號的真值)。

備註:具體關於記憶體對齊,請參閱之前的一篇博文:

struct和union的大小

結構體預設對齊方式 在預設對齊方式下,結構體成員的記憶體分配滿足下面三個條件 1.第乙個成員的位址和結構體的首位址相同,即偏移量為0。2.結構體每個成員位址相對於結構體首位址的偏移量 offset 是該成員大小的整數倍,如果不是則編譯器會在成員之間新增填充位元組 internal adding 3....

struct和union的記憶體分配

struct struct結構體在分配記憶體時需要遵循記憶體對齊規則 1.結構體的起始儲存位置必須是能夠被該結構體中最大的資料型別所整除 2.前面單元的大小必須是後面單元大小的整數倍 每個資料成員儲存的起始位址必須是自身大小的整數倍 如果不夠就補齊 3.整個結構體的大小 即sizeof的結果 必須是...

Struct 和 Union 的詳細區別

union 共用體 struct 結構體 兩者的區別 1 共用體和結構體都是由多個不同的資料型別成員組成,但在任何同一時刻,共用體只存放乙個被選中的成員,而結構體則存放所有的成員變數。2 對於共用體的不同成員賦值,將會對其他成員重寫,原來成員的值就不存在了,而對於結構體的不同成員賦值是互不影響的 3...