一 简介
首先下面两个结构体,所含三个类型均一致只是排序不同。但所占内存却不一样,要知道为什么我们就需要了解结构体的内存对齐规则。
二 offsetof
为了探究结构体的对齐规则
我们用 offsetof 辅助研究,下图是官方给出的使用方法(绿色字体)及作用介绍;
offsetof,该宏用于求结构体中一个成员在该结构体中的偏移量。
offsetof( type , member );
第一个参数 type 是结构体的名字,第二个参数 member 是结构体成员的名字。该宏返回成员member 在结构体中的内存偏移量。偏移量是size_t类型的。
第一个成员偏移量统一从0开始
例:
#include <stddef.h>
#include <stdio.h>
struct address {
char c1;
char c2;
int i;
}ddc;
int main()
{
printf(“address 结构中的 c1 偏移 = %d 字节。\n”,
offsetof(struct address, c1));
printf(“address 结构中的 c2 偏移 = %d 字节。\n”,
offsetof(struct address, c2));
printf(“address 结构中的 i 偏移 = %d 字节。\n”,
offsetof(struct address, i));
return(0);
}
运行结果:
address 结构中的 c1 偏移 = 0 字节。
address 结构中的 c2 偏移 = 1 字节。
address 结构中的 i 偏移 = 4 字节。
三 对齐规则
1 第一个成员偏移量统一从0开始
2 从第二个元素开始,需要放在 该类型的大小 的 整数倍 上(c2类型大小为1,1字节位是1的倍数所以可以放置在1的位置上)
3 从第三个元素也一样(只要不是第一位成员),需要放在 该类型的大小 的 整数倍 上(i类型大小为4,前面两个元素后面的2/3字节都不是4的倍数,直至第4个字节位是4的倍数所以可以放置在4的位置上)
4 最后所占大小还要取决于结构体中最大数据类型的整数倍,在上面最大的数据类型为int(4字节),最后一个元素 i 从4字节开始放置至7结束。0~7字节占了8个字节,刚好是最大的数据类型int
(4字节)的倍数所以sizeof(ddc) = 8;