C语言——结构体内存对齐规则

C语言结构体内存对齐规则:

1. 第一个成员在与结构体变量偏移量为0的地址处。 2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。 4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

附1:

对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的值为8 接下来楼主用一些例子来帮助大家理解结构体对齐规则(注:楼主使用的是VS2013编译器)

附2:常见类型在VS编译器中所占空间大小

C语言标准规定: sizeof(long long)>=sizeof(long)>=sizeof(int)

例子1:

1、因为第一个类型为int类型(占4个字节),编译器会默认放到偏移量为0的地址处。

2、从第二个结构体成员及后续其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。double类型占8个字节,VS2013默认对齐数为8,两个的较小值为8,所以对齐数为8,要对齐到的地址处为8的整数倍,所以接下来往下存放时,只能放到8的地址处,跳过4、5、6、7地址处,因为他们不是8的整数倍,不能用来存放,所以只能浪费这些空间了,因为结构体要对齐嘛。

3、第三个结构体成员变量为char类型,所占空间大小为1,跟VS默认对齐数8比较,较小,所以此时第三个结构体成员的默认对齐数为1,而下一个地址处为16,16是1的整数倍,所以char类型就直接放到16地址处的位置

4、这样一算结构体所占空间大小为17个字节,但是你以为这个结构体的内存空间就占17个字节了吗?不,结构体对齐还有三个规则: 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。在这个结构体中最大对齐数为double所对应的8,所以呢,结构体最终的所占内存空间必须得是8的整数倍,会自动补齐。

5、最终结果就是这个结构体占24个字节

例子二:

1、根据结构体内存对齐的第一个规则,现将char类型放到偏移量为0的地址处。

2、根据我们第二个规则和第4个规则:如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。结构体内部最大对齐数为double类型所对应的8,所以结构体应该从地址处为8的整数倍处开始存放。

3、int类型所占空间大小是4,VS编译器默认对齐数是8,较小值是4,所以对齐数就是4,32是4的整数倍,所以从32地址处开始存放int类型。 4、这个时候算出来的结构体的大小是36,但是最大对齐数却是student结构体里面的double类型所对应的8,结构体的大小必须是最大对齐数的整数倍,所以要补齐 5、所以计算出来的结构体大小的最终结果是40!

附2:

但凡一切我解释不通的,我都可以说是C语言标准规定的,就是那样子的,没有为什么,C语言中结构体内存对齐规则就是这个样子的,没有为什么,一切都是标准规定的!

备注:

2022.2.17

经验分享 程序员 微信小程序 职场和发展