关于结构体的内存分配问题--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

可以看到,再分配内存时,其实是有“动态”分配的意思的,即:系统会”动态“地根据具体需要,以最”节省“的方式对齐并分配”连续的“内存,如图:
最后也需要对齐
最节省分配方式

智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告