關於結構體的內存分配問題--sizeof(/*struct*/A)

問題描述:

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

舉個栗子:


  1. 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

可以看到,再分配內存時,其實是有“動態”分配的意思的,即:系統會”動態“地根據具體需要,以最”節省“的方式對齊並分配”連續的“內存,如圖:
最後也需要對齊
最節省分配方式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章