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