结构体对齐(Struct Alignment)与内存布局控制
解释C++结构体的内存对齐规则。什么是自然对齐?alignof和alignas如何控制对齐?为什么结构体成员顺序影响大小?如何用#pragma pack改变对齐?
回答
我是大山
对齐规则:结构体成员按自身大小对齐(如int按4字节对齐,double按8字节对齐),结构体总大小为最大成员对齐值的整数倍(末尾填充)。成员顺序影响大小:较大成员放在前面减少填充。例:struct A { char c; int i; };大小12(4+4+4填充);优化为struct B { int i; char c; };大小8。alignof(Type)返回类型的对齐要求,alignas(N)可修改对齐(如alignas(64) char buffer[64];用于缓存行对齐)。#pragma pack(push,1)强制1字节对齐(取消填充),用于网络协议/文件格式解析,但会导致未对齐访问的性能惩罚。C++11的std::aligned_storage和C++23的std::assume_aligned辅助对齐控制。注意:指针未对齐在某些架构(ARM)上导致SIGBUS崩溃。