亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

堆棧變量是否由GCC __attribute __((aligned(x)))對齊?

堆棧變量是否由GCC __attribute __((aligned(x)))對齊?

C
米琪卡哇伊 2019-12-11 13:09:38
我有以下代碼:#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 回答

?
holdtom

TA貢獻1805條經驗 獲得超10個贊

我相信問題是您的陣列在堆棧上。因為在函數啟動時堆棧指針可以是任何東西,所以如果不分配過多的內存并進行調整,就無法對齊數組。如果將數組移出函數并移至全局變量,則該數組應該起作用。您可以做的另一件事是將其保留為局部變量(這是一件非常好的事情),但要使其成為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-12-12
?
慕萊塢森

TA貢獻1810條經驗 獲得超4個贊

最近的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-12-12
  • 3 回答
  • 0 關注
  • 346 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號