不同系统下的C语言类型长度
概念
某种类型对象的地址必须是某个值K(通常是2,4或8)的倍数。如果一个变量的内存地址正好位于它长度的整数倍,就叫做自然对齐。
对齐简化了行程处理器和存储器系统之间的接口的硬件设计。
Example
#include<stdio.h>
int main()
{
struct test {
char a;
short b;
int c;
long d;
};
struct test t = {'a',11,11,11};
printf("size of struct t = %u\n", sizeof(t));
return 0;
}
总共16
struct test2 {
int a;
long b;
char c;
};
总共24
struct test1 {
int a;
long b;
};
总共16
struct test4 {
char a;
struct test1 b;
int c;
};
将test1进行了拆开,同时test4.a到test4.b还是按照test4中的最大值来进行对齐的。
处理字节对齐
编译器处理字节对齐的原则
- 数据类型自身的对齐值:为指定平台上基本类型的长度。对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节。
- 结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。
- 指定对齐值:#pragma pack (value)时的指定对齐值value。
- 数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值。
结构体类型的对齐
当数据类型为结构体时,编译器可能需要在结构体字段的分配中插入间隙,以保证每个结构元素都满足它的对齐要求。第一个数据变量的起始地址就是数据结构的起始地址。结构体的成员变量要对齐排放(对于非对齐成员需要在其前面填充一些字节,保证其在对齐位置上),结构体本身也要根据自身的有效对齐值圆整(就是结构体总长度需要是结构体有效对齐值的整数倍),此时可能需要在结构末尾填充一些空间,以满足结构体整体的对齐—-向结构体元素中最大的元素对齐。