代码之家  ›  专栏  ›  技术社区  ›  Sebastian

G++对齐问题

  •  0
  • Sebastian  · 技术社区  · 16 年前

    我有以下代码:

    #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 回复  |  直到 16 年前
        1
  •  2
  •   ephemient    16 年前

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

    通常不能保证堆栈在x86上有任何形式的对齐,请参见 Bug 16660 . 此外,GCC还依赖于链接器来对齐全局/公共变量,而2.20之前的binutils在Windows上实际上不具备这样的能力。

        2
  •  1
  •   Community Mohan Dere    9 年前

    检查问题的答案 GCC __attribute__((aligned(x)) explanation 上面写着:

    因为堆栈指针可以 当函数启动时, 无法对齐数组 没有分配比你多很多 需要和调整它