问题描述:
结构体内存对齐问题值直接的体现就是计算结构体的sizeof占用的字节数。
结构体内存对齐的几个原则,有了这几个原则,不管结构体里面是什么元素,我们都能够正确算出sizeof值(以VS2013为例)
原则1: 结构体中每一个元素放置到内存中时,它都会认为内存是以它自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始(以结构体变量首地址为0计算)。
原则2: 在原则1的基础上,检查计算出的存储单元是否为所有元素中最宽的元素的长度的整数倍,是,则结束;若不是,则补齐为它的整数倍。
原则3: 对于一个结构体中包含另外一个结构体成员,下面例子会讲解,例如结构体S1作为结构体S2的一个数据成员,在计算时结构体S1的数据会作为一个整体去对齐。
以如下代码为例:
#include <stdio.h> struct S1 { char ch1; int a; double d1; char ch2; }; struct S2 { char ch3; struct S1 s; int b; char ch4; double d2; }; int main() { printf("%d\n", sizeof(struct S1)); printf("%d\n", sizeof(struct S2)); return 0; }运行结果: 24 48
下面根据上面的3个原则,可以绘制出下面两个占位图,其中1表示占用内存,0表示空闲。
结构体S1的示意图如下:
结构体S2的示意图如下: