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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhao3132453/article/details/87972108

意义:

节约空间,提高存取效率

知识点:

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) 设置对齐方式,而不是使用默认的

猜你喜欢

转载自blog.csdn.net/zhao3132453/article/details/87972108
今日推荐