为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
至尊宝的传说 2019-10-28 10:53:49
我有以下代码:#include <stdio.h>intmain(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。
查看完整描述

3 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

我相信问题是您的阵列在堆栈上。因为在函数启动时堆栈指针可以是任何东西,所以如果不分配过多的内存并进行调整,就无法对齐数组。如果将数组移出函数并移至全局变量,则该数组应该起作用。您可以做的另一件事是将其保留为局部变量(这是一件非常好的事情),但要使其成为static。这样可以防止将其存储在堆栈中。请注意,这两种方式都不是线程安全的或递归安全的,因为将只有该数组的一个副本。


使用此代码:


#include <stdio.h>


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


int

main(void)

{

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

}

我得到这个:


0x804c000 0x804c004 0x804c008 0x804c00c

这是预期的。使用您的原始代码,我将像您一样获得随机值。


查看完整回答
反对 回复 2019-10-28
?
慕神8447489

TA贡献1780条经验 获得超1个赞

最近的GCC(经4.5.2-8ubuntu4测试)似乎可以正常工作,并且阵列正确对齐。


#include <stdio.h>


int main(void)

{

    float a[4] = { 1.0, 2.0, 3.0, 4.0 };

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

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


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

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

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

}

我得到:


0x7ffffffefff0 0x7ffffffefff4 0x7ffffffefff8 0x7ffffffefffc

0x7ffffffef000 0x7ffffffef004 0x7ffffffef008 0x7ffffffef00c

0x7ffffffe0000 0x7ffffffe0004 0x7ffffffe0008 0x7ffffffe000c


查看完整回答
反对 回复 2019-10-28
  • 3 回答
  • 0 关注
  • 855 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信