结构体的大小——结构体对齐问题
C语言中,基本数据类型与操作系统有关(虽然直接与编译器相关),基本没有什么变化。比如在32位操作系统中,int占4个字节,long占4个字节,char占1个字节,double占8个字节。但是结构体的大小并不只与操作系统有关了,与编译器有比较大的关系。
不同的编译器有不同的对齐方式,下面以32为linux下gcc4.6为例,分析一下gcc中结构体对齐的问题。
C中可以使用#pragma pack(n)来手动设定对齐数值。gcc默认是4,即按照4字节对齐。一般有如下的对齐规则:
1、结构体的第一个数据成员的相对位置为0,后续数据成员按n指定的值和该数据成员自身大小中较小的那个进行对齐。
2、不仅需要数据成员对齐,结构体本身也需要对齐。按照n的值和结构体数据成员中最长的长度中较小的进行对齐。结构体本身对齐即结构体最终的大小须是对齐数值的倍数,且不小于所有数据成员对齐之后的和。
对齐也即意味着数据的相对地址开始值须是对齐数值的倍数。
struct test { int i;//4 char c;//1 long l;//4 double d;//8}