结构体MyData对齐值不等于大小的原因及内存分配相关疑问
关于C++结构体内存对齐的两个问题
示例结构体代码:
struct MyData { short Data1; short Data2; short Data3; };
提出的问题
- 为何
MyData的对齐值为2而非其sizeof值6?结构体的对齐计算方式是否与基础类型存在特殊差异? - 根据微软《Alignment》文档定义:“若地址为Xn+0,则称该地址按X对齐”,这是否意味着
MyData对象仅在地址为2的倍数时才是对齐的?若如此,结构体对齐值越大,内存中可分配的对齐MyData对象数量越少?该假设是否正确?
问题1解答
结构体的对齐要求由其成员中对齐要求最高的类型决定,和结构体总大小无关。
MyData的所有成员都是short类型,在微软环境下short的对齐值为2,因此整个结构体的对齐值继承了成员的最大对齐要求,也就是2。
结构体和基础类型的对齐逻辑核心一致:都是为了让CPU能高效访问数据,避免跨内存块读取带来的性能损耗。区别仅在于,基础类型的对齐值是自身固有属性,而结构体的对齐值取其成员的最大对齐值。另外,结构体的总大小会被调整为自身对齐值的整数倍——这里MyData的总大小是6,刚好是2的3倍,所以不需要额外填充字节,sizeof(MyData)结果为6。
问题2解答
- 对
MyData的对齐理解正确:它的对齐值是2,所以只要对象起始地址是2的倍数(即地址能被2整除),就满足对齐要求。 - “对齐值越大,固定内存中可分配的对齐对象数量越少”这个假设是正确的。
当对齐值增大时,对对象起始地址的要求更严格,在固定大小的内存块里,符合对齐要求的起始位置数量会减少。比如换个更直观的例子:若对象大小为5,在10字节的内存块中:
- 对齐值为2时,可在地址0、6处放置对象,总共能放2个;
- 对齐值为4时,仅能在地址0处放置对象,下一个有效起始地址8加上对象大小会超出内存范围,只能放1个。
显然对齐值越高,可分配的对齐对象数量越少。
内容的提问来源于stack exchange,提问作者Huy Nhat Tran
相关产品推荐
相关产品推荐

