1、共用体(union)所占的字节数是最大的成员内存。
2、结构体(struct)类型占用的内存空间的计算方法:所有成员的内存的和,内存对齐是按偏移计算的。
在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding)
2.1、默认情况下,Linux操作系统是以4字节对齐,windows操作系统则是以最大的内置类型对齐。
2.2、32位系统:
4字节对齐
每行4个字节,字符数据按照一个一个的存储
2.3、64位系统:
根据最大变量的长度确定对齐的,如果最长数据为8字节,则8字节对齐,如果最长数据为4字节,则4字节对齐(按照最长类型的字节数对齐)
3、结构体中有2个以上的数据时,才考虑对齐问题,如果只有一个,这个类型长度是多少,结构体长度就是多少
4、更改C编译器的缺省字节对齐方式
在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。
4.1、一般地,可以通过下面的方法来改变缺省的对界条件:
· 使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。· 使用伪指令#pragma pack (),取消自定义字节对齐方式。
4.2、还有如下的一种方式:
· __attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。· __attribute__ ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
4.3、以上的n = 1, 2, 4, 8, 16... 第一种方式较为常见。
4.4、#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果”。