Union和struct的記憶體分配區別

2022-02-04 20:50:13 字數 1291 閱讀 8240

今天看到有一段程式裡在struct裡面用了個union,然後就突然想到了struct和union的區別,

找了些資料後發現,struct和union在記憶體分配的時候有區別,union裡的資料是公用一塊記憶體……,所以給其分配的記憶體總是union裡面所定義的最大型別長度的整數倍。

而struct裡的資料跟union不一樣,它們不共享一塊記憶體,他是按照struct裡面定義的資料順序來進行分配記憶體的,但是分配的基本單位是struct裡面所定義的最長的資料型別的長度。

舉個形象的例子:

struct裡面定義的資料型別的順序為:

int a;

char b;

double c;

那個系統分配給這個struct的記憶體空間是多少呢?

應該是16!

為什麼呢?因為系統先分配8個位元組用來放int,結果int只需要4個就夠了,然後剩下的4個中的乙個可以用來放後面的char,碰到double c時,因為此時的3個位元組不能存下,所以再分配了乙個8個位元組來存放double c

試想下如果struct裡面定義的資料型別的順序為:

int a;

double b;

char c;

那個系統分給這個struct的記憶體空間又是多少呢?

應該是24!

知道為什麼的吧?系統碰到int分給他8個位元組存放,碰到double時,剩下的4個位元組不足以存放,所以再分配了8個位元組,再遇到char c時又分配了8個位元組,這樣系統其實是浪費了5個位元組的空間。

所以在結構體裡面最好按照型別從小到大的順序來……

#include

using namespace std;

struct a1

;struct a2

;struct a3

;union b1

;union b2

;union b3

;union b4

;int main()

u; int k;

}a;

int main()

union型別是共享記憶體的,以size最大的結構作為自己的大小,這樣的話,myun這個結構就包含u這個結構體,而大小也等於u這個結構體的大小,在記憶體中的排列為宣告的順序x,y,z從低到高,然後賦值的時候,在記憶體中,就是x的位置放置4,y的位置放置5,z的位置放置6,現在對k賦值,對k的賦值因為是union,要共享記憶體,所以從union的首位址開始放置,首位址開始的位置其實是x的位置,這樣原來記憶體中x的位置就被k所賦的值代替了,就變為0了,這個時候要進行列印,就直接看記憶體裡就行了,x的位置也就是k的位置是0,而y,z的位置的值沒有改變,所以應該是0,5,6

struct和union的記憶體分配

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

struct和union的大小

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

struct和union在記憶體中占用空間大小的計算

資料型別 32位系統 64位系統 bool 1位元組1位元組 char 1位元組1位元組 short 2位元組2位元組 int4位元組 4位元組long 4位元組8位元組 long long 8位元組8位元組 float 4位元組4位元組 double 8位元組8位元組 long double 12...