今天在調試代碼時,關於struct與union內存分配問題產生了疑惑,故上網查詢了相關資料,記於此,以便日後查看。
struct與union在內存分配的時候,主要區別如下:
前者按照結構體內定義的數據順序來進行分配內存的,分配的基本單位(即:每分配一次的量)是struct裏面所定義的最長數據類型的長度;後者聯合體內的數據共用一塊內存,是以union裏面所定義的最大類型長度的整數倍來分配內存的。
定義之類的東東總是讓人感到枯燥乏味,舉個形象的例子,有一個struct類型變量定義如下:
struct {
int a;
char b;
double c;
}demo;
那麼系統分配給demo結構體的內存空間是多大呢?
答案是16!爲什麼呢?因爲系統先分配8個字節用來放int,結果int只需要4個就夠了,然後剩下的4箇中的一個可以用來放後面的char,碰到double c時,因爲此時的3個字節不能存下,所以再分配了一個8個字節來存放double c。
試想一下,如果這個struct類型變量其內存定義的變量順序改變成如下所示:
struct {
int a;
double b;
char c;
}demo;
那個系統分給這個struct的內存空間又是多少呢?應該是24!知道爲什麼的吧?系統碰到int分給他8個字節存放,碰到double時,剩下的4個字節不足以存放,所以再分配了8個字節,再遇到char c時又分配了8個字節,這樣系統其實是浪費了5個字節的空間。所以在結構體裏面最好按照類型從小到大的順序來。
一個簡單的測試例子:
#include <stdio.h>
struct S1 {
char c;
double b;
};
struct S2 {
char c1;
double b;
char c2;
};
struct S3 {
char c1;
char c2;
double b;
};
union U1 {
char c;
double b;
};
union U2 {
char c1;
double b;
char c2;
};
union U3 {
char c1;
char c2;
double b;
};
union U4 {
int a[5];
double b;
};
int main()
{
printf("sizeof(S1) = %d\n", sizeof(S1));
printf("sizeof(S2) =%d\n", sizeof(S2));
printf("sizeof(S3) =%d\n", sizeof(S3));
printf("sizeof(U1) = %d\n", sizeof(U1));
printf("sizeof(U2) = %d\n", sizeof(U2));
printf("sizeof(U3) = %d\n", sizeof(U3));
printf("sizeof(U4) = %d\n", sizeof(U4));
return 0;
}
/**
* 運行結果:
* sizeof(S1) = 16
* sizeof(S2) = 24
* sizeof(S3) = 16
* sizeof(U1) = 8
* sizeof(U2) = 8
* sizeof(U3) = 8
* sizeof(U4) = 24
*/