2010-03-16 25 views
6

我正在使用gcc和發佈版本的-finline-functions優化。爲了防止代碼膨脹,因爲我在嵌入式系統上工作,我想說不要內聯特定的函數。執行此操作的顯而易見的方法是通過函數屬性,即屬性(noinline)。問題是,當我打開屬於-O3開關的全局-finline-functions優化時,這似乎不起作用。gcc -finline-functions行爲?

它也與它被模板化爲一個非模板版本的相同功能沒有得到內聯,這是預期的。

有沒有人有任何想法,當這個全局開關打開時如何控制內聯?

下面的代碼:

#include <cstdlib> 
#include <iostream> 

using namespace std; 

class Base 
{ 
public: 

    template<typename _Type_> 
    static _Type_ fooT(_Type_ x, _Type_ y) __attribute__ ((noinline)); 
}; 

template<typename _Type_> 
_Type_ Base::fooT(_Type_ x, _Type_ y) 
{ 
    asm(""); 
    return x + y; 
} 


int main(int argc, char *argv[]) 
{ 
    int test = Base::fooT(1, 2); 
    printf("test = %d\n", test); 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 
+1

不相關,但以下劃線開頭,後跟大寫字母的標識符爲編譯器保留。 – GManNickG 2010-03-16 00:05:29

+0

不應該將__attribute __((noinline))附加到定義上嗎? – jpalecek 2010-03-16 00:09:23

+0

@jpalecek:這是編譯錯誤 – user176168 2010-04-01 15:42:23

回答

4

docs for GCC's noinline說:

此函數屬性防止函數被認爲是內聯。如果函數沒有副作用,除了內聯以外,還有一些優化會導致函數調用被優化,儘管函數調用是實時的。爲了保持這樣的電話被優化掉,在調用的函數把

 asm (""); 

(見擴展ASM),作爲一種特殊的副作用

我認爲,可能會發生在你身上是因爲Base::fooT<>函數沒有副作用,GCC正在調用上面提到的未指定的其他優化。

+0

對不起,延遲迴復!不幸的是,海灣合作委員會仍然強調它,我曾嘗試過。我正在使用4.1.1有沒有人知道與此有關的錯誤?感謝您的回覆,雖然似乎沒有關於這個話題的非常多的知識... – user176168 2010-03-31 15:00:20

1

嘗試把noinline屬性static之後的定義,像這樣前:

template<typename _Type_> 
    static __attribute__ ((noinline)) _Type_ fooT(_Type_ x, _Type_ y); 

這個工作對我來說,似乎爲別人工作過,請參閱:How can I tell gcc not to inline a function?

出於某種原因,它不在函數後面放置noinline屬性,或者將asm("")放在函數體中,儘管gcc文檔中提到了這一點。

1

一點舊線程,但值得回答。 如果上面沒有任何內容適用於您,總是有簡單的解決方法。您必須將轉換單元中的實現隱藏到您想要使用此類方法的位置,方法是將其放入另一個cpp文件中。

EDIT

在GCC> = 4.5有一個屬性noclone這在專業的功能的方式取代noinline