C语言中char _Alignas(double)变量地址间隔为何不是8字节
问题解答
核心原因
这个差值是栈的增长方向+对齐规则+变量本身大小共同作用的结果,和sizeof(double)没有直接关系,具体逻辑如下:
- x86_64架构的栈默认从高地址向低地址分配空间,先声明的局部变量会被分配到更高的栈地址
_Alignas(double)仅约束变量的起始地址必须满足double的对齐要求(即地址是8的整数倍),不会改变变量本身的类型和大小:c2的类型依然是char,大小仅为1字节- 两个地址的差值是高地址减 低地址的结果,不代表低地址变量的占用大小
逐位推导你的运行结果
你的输出中:
- 先声明的
c1地址为0x61FE1F(高地址),占用这1个字节的空间 - 接下来分配
c2时,需要从低于0x61FE1F的地址中,找到第一个满足8字节对齐的地址,计算可得就是0x61FE18(0x61FE18 % 8 = 0,符合对齐规则) - 两者地址差为
0x61FE1F - 0x61FE18 = 7,中间的0x61FE19到0x61FE1E共6个字节是编译器自动插入的对齐填充位,加上c2本身占的1字节,刚好凑够7字节的差值。
验证方法
你可以额外打印sizeof(c2),输出结果会是1而非8,就能确认_Alignas没有修改变量本身的大小,仅约束了起始地址的对齐规则。如果把两个变量的声明顺序调换(先声明c2再声明c1),你会看到两者的地址差变为1,进一步验证栈分配的逻辑。
内容的提问来源于stack exchange,提问作者Hongyuan
相关产品推荐
相关产品推荐

