我有以下代码:
#include <stdio.h>
int main(void)
{
int x __attribute__ ((aligned (16))) = 0;
printf("%lX\n", &x);
return 0;
}
使用mingw32-c ++。exe(GCC)3.4.5编译和运行此代码(mingw-vista special r3)
打印0x22FF24
0b1000101111111100100100
。
使用g ++(Debian 4.3.2-1.1)编译和运行此代码4.3.2打印0x7FFFF470EE90
0b11111111111111111110100011100001110111010010000
。
由于对齐,我希望变量地址的最后7位为零。我在推理中犯了错误吗?发生了什么事?
提前致谢,
塞巴斯蒂安
答案 0 :(得分:2)
16 = 2 4 ,所以如果地址与16字节边界对齐,我希望地址的最后4位为零。
通常不保证堆栈在x86上具有任何对齐方式,请参阅Bug 16660。此外,GCC依赖于链接器来对齐全局/公共变量,而2.20之前的binutils在Windows上实际上无法做到这一点。
答案 1 :(得分:1)
检查问题GCC __attribute__((aligned(x))
explanation的答案:
因为堆栈指针可能是 函数启动时的任何事情, 没有办法对齐数组 没有分配比你更多的东西 需要并调整它