堆栈变量是否由GCC __attribute __((aligned(x)))对齐?

我有以下代码:


#include <stdio.h>


int

main(void)

{

        float a[4] __attribute__((aligned(0x1000))) = {1.0, 2.0, 3.0, 4.0};

        printf("%p %p %p %p\n", &a[0], &a[1], &a[2], &a[3]);

}

我有以下输出:


0x7fffbfcd2da0 0x7fffbfcd2da4 0x7fffbfcd2da8 0x7fffbfcd2dac

为什么地址a[0]不是的倍数0x1000?


到底__attribute__((aligned(x)))是什么?我误解了这个解释吗?


我正在使用gcc 4.1.2。


至尊宝的传说
浏览 856回答 3
3回答

慕尼黑5688855

我相信问题是您的阵列在堆栈上。因为在函数启动时堆栈指针可以是任何东西,所以如果不分配过多的内存并进行调整,就无法对齐数组。如果将数组移出函数并移至全局变量,则该数组应该起作用。您可以做的另一件事是将其保留为局部变量(这是一件非常好的事情),但要使其成为static。这样可以防止将其存储在堆栈中。请注意,这两种方式都不是线程安全的或递归安全的,因为将只有该数组的一个副本。使用此代码:#include <stdio.h>float a[4] __attribute__((aligned(0x1000))) = {1.0, 2.0, 3.0, 4.0};intmain(void){&nbsp; &nbsp; &nbsp; &nbsp; printf("%p %p %p %p\n", &a[0], &a[1], &a[2], &a[3]);}我得到这个:0x804c000 0x804c004 0x804c008 0x804c00c这是预期的。使用您的原始代码,我将像您一样获得随机值。

慕神8447489

最近的GCC(经4.5.2-8ubuntu4测试)似乎可以正常工作,并且阵列正确对齐。#include <stdio.h>int main(void){&nbsp; &nbsp; float a[4] = { 1.0, 2.0, 3.0, 4.0 };&nbsp; &nbsp; float b[4] __attribute__((aligned(0x1000))) = { 1.0, 2.0, 3.0, 4.0 };&nbsp; &nbsp; float c[4] __attribute__((aligned(0x10000))) = { 1.0, 2.0, 3.0, 4.0 };&nbsp; &nbsp; printf("%p %p %p %p\n", &a[0], &a[1], &a[2], &a[3]);&nbsp; &nbsp; printf("%p %p %p %p\n", &b[0], &b[1], &b[2], &b[3]);&nbsp; &nbsp; printf("%p %p %p %p\n", &c[0], &c[1], &c[2], &c[3]);}我得到:0x7ffffffefff0 0x7ffffffefff4 0x7ffffffefff8 0x7ffffffefffc0x7ffffffef000 0x7ffffffef004 0x7ffffffef008 0x7ffffffef00c0x7ffffffe0000 0x7ffffffe0004 0x7ffffffe0008 0x7ffffffe000c
打开App,查看更多内容
随时随地看视频慕课网APP