C++结构体对齐简要说明

意义:

节约空间,提高存取效率

知识点:

1、结构体的起始存储位置必须是能够被该结构体中最大的数据类型所整除

2、每个数据成员存储的起始位置是自身大小的整数倍

3、对齐后的长度必须是成员中最大的对齐参数的整数倍

4、复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式

示例代码:

struct A
{
    int a;
    char b;
    short c;
};
//sizeof(A)=8

struct B
{
    char a;
    int b;
    short c;
};
//sizeof(B)=12

struct C
{
    short a;
    char b;
    int c;
};
//sizeof(c)=8

分析:(32位,默认对齐,假设从0x0000开始)

A:

int a 占4个字节,0x0000-0x0003

char b占1个字节,0x0004,再补充1个字节,0x0004-0x0005(原因见下一条)

short c占2字节,0x0006-0x0007,前边有5个字节,不能整除2,所以上一个要补充一个字节来对齐

B:

char a占1个字节,0x0000,再补充3个字节,0x0000-0x0003(原因见下一条)

int b占4个字节,0x0004-0x0007,前边有一个字节,不能整除2,所以上一个要补充3个字节来对齐

short c占2个字节,0x0008-0x0009,一共10个字节,不是最大类型4的整数倍,所以补充2个字节,0x0008-0x0011

C:略

总结:

1、结构体中的变量尽量按照类型大小从小到大依次声明,尽量减少中间的填充字节

2、也可以使用保留字节的形式显示对齐

3、使用#pragma pack(n) 设置对齐方式,而不是使用默认的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值