c语言中结构体对齐,C语言中结构体对齐.pdf

C语言中结构体对齐,c语言结构体对齐,c语言结构体内存对齐,c语言结构体字节对齐,c语言中的结构体,c语言中结构体的使用,c语言中结构体,c语言中结构体的定义,c语言中结构体定义,c语言结构体

C 语言中结构体对齐(来自网络)

C 语言结构体对齐也是老生常谈的话题了。基本上是面试题的必考题。内容虽然很基础,但一不小心

就会弄错。写出一个struct,然后sizeof ,你会不会经常对结果感到奇怪?sizeof 的结果往往都比你声明的

变量总长度要大,这是怎么回事呢? 开始学的时候,也被此类问题困扰很久。其实相关的文章很多,感

觉说清楚的不多。结构体到底怎样对齐?

有人给对齐原则做过总结,具体在哪里看到现在已记不起来,这里引用一下前人的经验(在没有

#pragma pack 宏的情况下):

原则 1、数据成员对齐规则:结构(struct 或联合union)的数据成员,第一个数据成员放在offset

为 0 的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如 int 在 32

位机为4字节,则要从4 的整数倍地址开始存储)。

原则 2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大

元素大小的整数倍地址开始存储。(struct a 里存有struct b,b 里有 char,int,double 等元素,

那b 应该从 8 的整数倍开始存储。)

原则 3、收尾工作:结构体的总大小,也就是sizeof 的结果,必须是其内部最大成员的整数倍,

不足的要补齐。

这三个原则具体怎样理解呢?我们看下面几个例子,通过实例来加深理解。

例 1:struct {

short a1;

short a2;

short a3;

}A;

struct{

long a1;

short a2;

}B;

sizeof(A) = 6; 这个很好理解,三个short 都为2 。

sizeof(B) = 8; 这个比是不是比预想的大2 个字节?long 为4 ,short 为2 ,整个为8,因为原则3 。

例2 :struct A{

int a;

char b;

short c;

};

struct B{

char b;

int a;

short c;

};

sizeof(A) = 8; int 为4 ,char 为 1,short 为2 ,这里用到了原则1 和原则3 。

sizeof(B) = 12; 是否超出预想范围?char 为 1,int 为4 ,short 为2 ,怎么会是12?还是原则1 和原则3 。

深究一下,为什么是这样,我们可以看看内存里的布局情况。

a b c

A 的内存布局:1111, 1*, 11

(其中星号*表示填充的字节。)

b a c

B 的内存布局:1***, 1111, 11**

A 中,b 后面为何要补充一个字节?因为c 为short,其起始位置要为2 的倍数,就是原则1。c 的后面

没有补充,因为b 和c 正好占用4 个字节,整个A 占用空间为4 的倍数,也就是最大成员int 类型的倍数,

所以不用补充。

B 中,b 是char 为 1,b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值