计算机取数据是固定长度,可以提高效率。C++中的变量存放遵循对齐原则。
什么叫字节对齐?
假如一个char类型变量按四字节对齐方式储存,那它就存储在一个四字节单元中,仅占据首字节地址,其它字节空闲。再存储下一个数据变量时,不会占用上个单元的空闲字节,只会开辟一个新的四字节单元。字节对齐数一般都是2的倍数。
结构体大小的计算方法
整体对齐:以结构体内最大基本数据类型的字节数为模板,成员按顺序填充。
局部对齐:填充时按前面已存储的最大数据类型字节进行对齐。
结尾补齐:补齐最大字节单元。
struct Node {
char c;
int h;
double s;
void* p;
char str[10];
}
该结构体的最大基本数据类型为double(8字节),所以以8字节为模板,结构体数据按顺序存储,首先为一个字节的char,再填充int的时候就为四字节对齐,两个数据变量共占8字节,依次类推,在最后不足8字节补齐。
所以该结构体的大小为32字节。
不同类型数据定义顺序不一样,也会导致结构体大小发生改变。将double和int的定义顺序交换,结构体大小就变成40字节,因为按默认的对齐方式char c独占8字节,str占了16字节。
设置字节对齐
#pragma pack(2)
struct Node {
char c;
int h;
double s;
int* p;
char str[10];
};
结构体大小为28字节,#pragma pack(2)对齐以2字节为模板。#pragma pack()则是系统默认方式对齐。
如有错误,欢迎大佬指正。