2009-12-16 89 views
6

我想使用'aligned(16)'屬性將函數字節對齊到16字節的邊界。我做了以下內容:void __attribute__((aligned(16))) function() { }C在GCC中的函數對齊

(來源:http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

但是當我編譯器(gcc foo.c的;不使用生成文件或鏈接腳本),我收到以下錯誤:

的foo.c :99:錯誤:對齊可能沒有被指定爲'函數'

我試着對齊到4,8,32等,以及錯誤仍然是一樣的。 我需要這個來爲基於powerpc的處理器調整一箇中斷服務程序。這樣做的正確方法是什麼?

+0

你爲什麼要這麼做? – 2009-12-16 07:26:48

+10

OP在第二句話中解釋了他們爲什麼需要這樣做。 – caf 2009-12-16 07:32:25

+3

對齊函數的另一個令人愉快的惡意使用是將額外的數據存儲在函數指針變量的低位中... – 2010-12-20 04:25:52

回答

8

爲什麼在編譯時爲什麼不通過-falign-functions = 16 gcc?

+2

太容易了,不是嗎? – 2009-12-16 07:19:02

+3

是的,我可以做到這一點,但這將對齊所有功能到16byte,而我只需要ISR獲得16字節對齊。 但是,如果沒有其他選擇,我將不得不這樣做。 – Sukanto 2009-12-17 12:03:03

+0

如果你不使用GCC> = 4.3,這是要走的路。 – Gonzalo 2009-12-17 19:18:33

2

您可能正在使用不支持該屬性的舊版gcc。您提供的文檔鏈接用於gcc的「當前開發」。仔細查看各種版本,該屬性僅出現在gcc 4.3及更高版本的文檔中。

+0

我想這是可能的。我的編譯器是gcc 4.0.0。 – Sukanto 2009-12-17 12:09:46

7

從我的回答對適應this GCC question,你可以嘗試使用#pragma指令,就像這樣:

#pragma GCC push_options 
    #pragma GCC optimize ("align-functions=16") 

    //add 5 to each element of the int array. 
    void add5(int a[20]) { 
     int i = 19; 
     for(; i > 0; i--) { 
      a[i] += 5; 
     } 
    } 

    #pragma GCC pop_options 

#pragma push_optionspop_options宏用於控制的optimize編譯的作用範圍。有關這些宏的更多細節可以在GCC docs中找到。


或者,如果你喜歡GCC的attribute syntax,你應該能夠做這樣的事情:

//add 5 to each element of the int array. 
    __attribute__((optimize("align-functions=16"))) 
    void add5(int a[20]) { 
     int i = 19; 
     for(; i > 0; i--) { 
      a[i] += 5; 
     } 
    }