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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值