g ++对齐问题

时间:2010-01-25 22:27:47

标签: c++ gcc alignment

我有以下代码:

#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位为零。我在推理中犯了错误吗?发生了什么事?

提前致谢,

塞巴斯蒂安

2 个答案:

答案 0 :(得分:2)

16 = 2 4 ,所以如果地址与16字节边界对齐,我希望地址的最后4位为零。

通常不保证堆栈在x86上具有任何对齐方式,请参阅Bug 16660。此外,GCC依赖于链接器来对齐全局/公共变量,而2.20之前的binutils在Windows上实际上无法做到这一点。

答案 1 :(得分:1)

检查问题GCC __attribute__((aligned(x)) explanation的答案:

  

因为堆栈指针可能是   函数启动时的任何事情,   没有办法对齐数组   没有分配比你更多的东西   需要并调整它