题目
cpp
class aa
{
char a;
int b;
char c;
};
class bb
{
char a;
char b;
int c;
};
std::cout << sizeof(aa)<<std::endl;
std::cout << sizeof(bb) << std::endl;
解释
cpp
结构体内存对齐是指结构体成员在内存中的存放位置必须满足特定的地址对齐规则,以提升访问效率并保证跨平台兼容性。它不仅影响结构体的大小,还直接关系到性能和硬件可访问性。
核心规则
首成员规则:第一个成员的偏移量为 0。
成员对齐:每个成员的起始地址必须是 min(成员类型大小, 编译器默认对齐数) 的整数倍。
结构体整体对齐:结构体总大小必须是其最大对齐数的整数倍。
嵌套结构体:嵌套成员需按其自身最大对齐数对齐,整体大小取所有最大对齐数的整数倍。
为什么需要对齐
硬件限制:部分 CPU(如 ARM)不支持非对齐访问,否则会触发异常。
性能优化:对齐数据可一次性读取,减少总线周期;未对齐可能需要多次访问。
跨平台兼容:不同平台对齐要求不同,对齐可避免数据结构在不同平台上表现不一致。
对齐控制方法
#pragma pack(n):修改默认对齐数(n 通常为 1, 2, 4, 8)。
alignas(n) / __attribute__((aligned(n))):C11/C++11 标准方式,控制整体对齐。
__attribute__((packed)):取消填充,实现紧凑布局(可能降低性能)。
解析答案
cpp
class aa
{
char a;
int b;
char c;
};
内存分布
■ . . .
■ ■ ■ ■
■ . . .
3*4=12
所以为12个字节
class bb
{
char a;
char b;
int c;
};
内存分布
■ ■ . .
■ ■ ■ ■
2*4=8
所以为8个字节