结构体是一种复合数据类型,通常编译器会自动的进行其成员变量的对齐,已提高数据存取的效率。在默认情况下,编译器为结构体的成员按照自然对齐(natural alignment)条方式分配存储空间,各个成员按照其声明顺序在存储器中顺序存储。自然对齐是指按照结构体中成员size最大的对齐,在cl编译器下可以使用
#pragma pack(n)
来指定结构体的对齐方式。
默认对齐方式
在默认对齐方式下,结构体成员的内存分配满足下面三个条件
1. 结构体第一个成员的地址和结构体的首地址相同
2. 结构体每个成员地址相对于结构体首地址的偏移量(offset)是该成员大小的整数倍,如果不是则编译器会在成员之间添加填充字节(internal adding)。
3. 结构体总的大小要是其成员中最大size的整数倍,如果不是编译器会在其末尾添加填充字节(trailing padding)。
下面是一个示例:
struct s1{
char ch;
int a;
double b;
char c1;
};
struct s2{
char ch;
int a;
double b;
};
int main()
{
cout << "s1的大小: " << sizeof(struct s1) << endl;