面试题答案
一键面试C++ 中结构体数据内存对齐规则
- 对齐系数:每个数据类型都有自己的对齐系数,例如
char
通常为 1,short
通常为 2,int
、float
通常为 4,double
通常为 8 等。不同编译器可能会有细微差别。 - 结构体成员对齐:结构体成员存储时,其偏移量必须是其对齐系数的整数倍。如果不是,则在成员之间填充字节以满足对齐要求。
- 结构体整体对齐:结构体的大小必须是其最大对齐系数成员的对齐系数的整数倍。如果不是,则在结构体末尾填充字节。
代码示例说明不同成员顺序对结构体大小的影响
#include <iostream>
// 定义结构体1
struct Struct1 {
char a;
int b;
short c;
};
// 定义结构体2,成员顺序不同
struct Struct2 {
int b;
char a;
short c;
};
int main() {
std::cout << "Struct1 size: " << sizeof(Struct1) << std::endl;
std::cout << "Struct2 size: " << sizeof(Struct2) << std::endl;
return 0;
}
在上述代码中:
Struct1
中char a
占 1 字节,int b
对齐系数为 4,a
之后需填充 3 字节使b
的偏移量为 4 的倍数,b
占 4 字节,short c
对齐系数为 2,b
之后无需填充,c
占 2 字节,最后结构体整体大小需为最大对齐系数(这里是 4)的整数倍,所以再填充 2 字节,Struct1
大小为 12 字节。Struct2
中int b
占 4 字节,char a
对齐系数为 1,无需填充,占 1 字节,short c
对齐系数为 2,a
之后填充 1 字节使c
的偏移量为 2 的倍数,c
占 2 字节,结构体整体大小已是最大对齐系数(4)的整数倍,Struct2
大小为 8 字节。这就体现了不同成员顺序对结构体大小的影响。