MSVC默认对齐下WAVEFORMATEX大小为何为20而非预期的18?
为何x86平台默认对齐下
sizeof(WAVEFORMATEX)是20而非预期的18? 先算WAVEFORMATEX结构体成员的总字节数:
- 5个
WORD类型成员(wFormatTag、nChannels、nBlockAlign、wBitsPerSample、cbSize):每个2字节,总计2×5=10字节 - 2个
DWORD类型成员(nSamplesPerSec、nAvgBytesPerSec):每个4字节,总计4×2=8字节
两者相加是10+8=18字节,这就是DirectXTK文档里提到的"预期大小"——它指的是结构体有效数据成员的总字节数,不包含编译器自动添加的填充字节。
实际编译后sizeof(WAVEFORMATEX)=20的核心原因是结构体对齐规则:
MSVC在x86平台的默认对齐策略中,结构体的整体大小必须是其内部最大基本数据类型大小的整数倍。这里结构体里最大的基本类型是DWORD(4字节),所以整个结构体的大小必须是4的整数倍。18不是4的倍数,编译器会自动在结构体末尾添加2字节的填充(padding),让总大小凑到20(4×5),满足对齐要求。
这种填充是编译器为提升内存访问效率做的优化:CPU访问对齐的内存地址比未对齐的更快,x86架构虽支持未对齐访问,但会存在性能损耗。你没有指定/Zp或/pack编译开关,所以编译器使用默认对齐规则,自然会加上这部分填充。
内容的提问来源于stack exchange,提问作者user3001150
相关产品推荐
相关产品推荐

