2011-11-17 26 views
2
#include <stdio.h> 

static void test() 
{ 
    printf("is this function considered for inline?"); 
} 

int main() 
{ 
    test(); // definition does not have inline keyword. But declaration at the bottom (which is never used) has a inline keyword. 
} 

inline static void test(); // definition WITH inline keyword 

會編譯器視圖test()好像inline關鍵字被附加到它嗎?這個函數是否考慮過內聯?

編輯:對不起,我的意思是在最後的聲明有一個內聯關鍵字!

+2

你編譯優化?在你的示例代碼中最後一行是什麼 - 甚至不能編譯 –

+1

我不認爲它是可能知道的,也可能是爲了反彙編。是否有你需要它的理由,還是這只是出於好奇?只是出於好奇。 – Ryan

+0

我很抱歉,但我的示例代碼中有一個巨大的錯誤。我的意思是在宣言結尾有一個內聯關鍵字! – SHH

回答

1

最好找出是看看大會。

使GCC考慮用於內聯的每個函數的編譯器標誌是-finline-functions。這是默認啓用-O3

所以在-O3,海灣合作委員會將考慮內聯的每個函數,即使沒有用inline聲明。

+0

我很抱歉,但我的示例代碼中有一個巨大的錯誤。我的意思是在宣言結尾有一個內聯關鍵字!它極大地改變了問題的背景。 – SHH

+0

這很不明確。最好的方法是在'-O2'下測試它,看看會發生什麼。該文檔沒有提到有關此訂購的任何內容。 (http://gcc.gnu.org/onlinedocs/gcc/Inline.html) – Mysticial

+0

是的,即使標準也沒有提到這個歧義的任何內容(它提到了外部鏈接的功能,但沒有提到任何關於靜態功能)。 – SHH

1

使用gcc -S進行編譯,看看彙編程序是什麼樣的,例如這是一個-O2--所以我們可以看到test()已經消失並且內聯了。你應該通過GCC

main: 
.LFB12: 
    .cfi_startproc 
    movl $.LC0, %edi 
    xorl %eax, %eax 
    jmp printf 
    .cfi_endproc 
.LFE12: 

而且沒有優化,我們可以看到通話測試()生成的.s文件

main: 
.LFB1: 
    .cfi_startproc 
    pushq %rbp 
    .cfi_def_cfa_offset 16 
    .cfi_offset 6, -16 
    movq %rsp, %rbp 
    .cfi_def_cfa_register 6 
    movl $0, %eax 
    call test 
    popq %rbp 
    .cfi_def_cfa 7, 8 
    ret 
    .cfi_endproc 
.LFE1: 
0

inline關鍵字是名不副實的,並不表示多當一個函數被有效內聯的時候。如果將它添加到定義它只是確保將此定義放置在頭文件中時,不會出現不同編譯單位(.o文件)中的「多個符號」問題。不要追求更多的東西。

如果一個函數被有效地內聯或不完全取決於編譯器。如果產生一個外部符號,您甚至無需做任何事情(您的static定義)。大多數編譯器都有擴展來規範這一點(例如,gcc的__attribute__((always_inline))),唯一的方法是檢查生成的彙編器或對象。