结构体对齐
1. 序言
以下结构体大小是多少?
例1:
struct st
{
char a;
int b;
};//8
例2:
struct st
{
char a;
short b;
};//4
例3:
struct st
{
int a ;
__int64 b ;
char c ;
};//24
例:4:
struct st
{
int a ;
__int64 b ;
char c ;
char d ;
};//24
2. 数据对齐的本质–效率or空间
1) 本级尺寸:如果本机是32位,那么对32位的数据支持最好。
2) 编译器遵守了这个规则:
char类型、short类型的参数不但没有节省空间,反而浪费了多余的操作。
3. 用法
1) n: 对齐参数,值为1, 2, 4, 8
#pragma pack(n)
结构体
#pragma pack()
2) 对齐原则
原则一:
数据成员对齐规则:结构的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储) 。
原则二:
结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。
原则三:
如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int&