关于Interlocked操作与内存对齐的技术疑问(附测试代码)
关于结构体成员对齐与Interlocked操作的疑问解答
首先直接给结论:是的,你这个结构体里的long成员完全满足Interlocked操作要求的32位边界对齐条件。
接下来具体解释:
- 所谓“对齐至32位边界”,本质就是要求变量的内存地址是4字节的整数倍(因为32位对应4字节)。从你的测试输出能看到,
an_S.l的地址比an_S.c大4字节——假设an_S.c的起始地址是X,那an_S.l的地址就是X+4,显然是4的倍数,完美符合32位对齐的要求。 - 这其实是编译器自动做的结构体成员对齐优化:
char类型只占1字节,为了让后面的long(通常是4字节)满足自身的对齐需求,编译器会在c后面自动填充3个字节的空白(也就是所谓的padding),这样l就刚好落在4字节对齐的地址上了。 - 再补充一点:Interlocked系列操作对对齐的要求,核心是变量地址必须是其自身数据类型大小的整数倍(32位整数对应4字节,64位对应8字节)。不管是用
_aligned_malloc手动控制对齐,还是编译器自动帮你做结构体成员对齐,只要满足这个地址倍数要求,就可以安全使用Interlocked操作。 - 如果你还想进一步确认,也可以加一行代码验证:
运行后输出应该是0,这就实锤了地址确实是4字节对齐的。printf("%u", (uintptr_t)&an_S.l % 4);
内容的提问来源于stack exchange,提问作者Wad
相关产品推荐
相关产品推荐

