問題描述:
C、C++中的結構體 struct A{變量列表}; 是定義類的一種方式,與class 關鍵字類似,同樣可以定義繼承方式爲public、private、protected三種方式,但是不同的是一點是,struct默認集成方式爲public,而class默認繼承方式爲private。
- 兩者的內存分配具體方式都需要考慮 內存對齊 問題。
- 這裏先分析struct的內存分配方式
基本類型的字節長度
bool: 1 byte
char: 1 byte
short: 2 byte
int: 4 byte
long: 4 byte
long long: 8 byte
float: 4 byte
double: 8 byte
<pointer> *: 4 byte
舉個栗子:
- struct
typedef struct A {
> char ch_a;
> int i_b;
> float f_c;
> double d_d;
> int * p_i_e;
> char * p_ch_f;
> short s_g;
> };
1 4 4 8 4 4 2
根據內存對齊:
1 4 對齊 === 1 + 3 + 4
4 8 對齊 === 4 + 4 + 8
4 4 不必對齊
2 與之前的對齊 === 2 + 6
sizeof(A) === 8 + 16 + 8 + 8 = 40
i. 調換順序: 大字節與1字節緊鄰
typedef struct A {
char ch_a;
double d_d;// 大字節變量提前
int i_b;
float f_c;
int * p_i_e;
char * p_ch_f;
short s_g;
};1 8 4 4 4 4 2
根據內存對齊:
1 8 對齊 === 1 + 7 + 8
4 4 不必對齊
4 4 不必對齊
2 與之前的對齊 === 2 + 6
sizeof(A) === 16 + 8 + 8 + 8 = 40
ii. 調換順序: 最“節省”分配方法
typedef struct A {
char ch_a;
short s_g;// 2 byte
int i_b;// 4 byte, 前三個和爲: 7 bytes
double d_d;// 大字節變量提前
float f_c;
int * p_i_e;
char * p_ch_f;
};1 2 4 8 4 4 4
根據內存對齊:
1,2,3 與 8 對齊 === 1 + 2 + 3 + 1 + 8
4 4 不必對齊
4 與之前的對齊 === 4 + 4
sizeof(A) === 16 + 8 + 8 = 32
可以看到,再分配內存時,其實是有“動態”分配的意思的,即:系統會”動態“地根據具體需要,以最”節省“的方式對齊並分配”連續的“內存,如圖: