在VC中,结构中各种数据类型有不同的对齐方式:
char 对齐偏移量必须是1的倍数
short 对齐偏移量必须是2的倍数
int 对齐偏移量必须是4的倍数
float 对齐偏移量必须是4的倍数
double 对齐偏移量必须是8的倍数
为了确保结构的大小为结构字节的边界数,(即该结构中占用最大空间的类型所占用的字节数)的倍数
所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。
如果需要对边界对齐进行调整,那么可以使用#pragma pack(n)来设定变量以n字节对齐方式,特别地,n = 1为不使用边界对齐。
n字节对齐就是说变量存放的起始地址的偏移量有两种情况:
1、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式。
char 对齐偏移量必须是1的倍数
short 对齐偏移量必须是2的倍数
int 对齐偏移量必须是4的倍数
float 对齐偏移量必须是4的倍数
double 对齐偏移量必须是8的倍数
为了确保结构的大小为结构字节的边界数,(即该结构中占用最大空间的类型所占用的字节数)的倍数
所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。
struct A
{
char c; //1
double d; //8 填充7字节对齐
int i; //4
};
//结构体填充4字节进行结构体边界对齐
class B
{
char c1 //1
A a; //A结构体的边界对齐是double(8字节),所以c1、c2后面各需要填充7个字节
char c2; //1
};
那么,sizeof A = 24; sizeof B = 40
如果需要对边界对齐进行调整,那么可以使用#pragma pack(n)来设定变量以n字节对齐方式,特别地,n = 1为不使用边界对齐。
n字节对齐就是说变量存放的起始地址的偏移量有两种情况:
1、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式。
2、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。