簡體   English   中英

內聯函數有地址嗎?

[英]Do inline functions have addresses?

在“The C ++ Programming Language”一書的第7.1.1節中,作者指出:

“內聯函數仍然有一個唯一的地址,內聯函數的靜態變量也是如此”

我很迷惑。 如果我有一個內聯函數,那么它就沒有地址。 這也發生在C嗎?

inline屬性只是編譯器的一個提示 ,它應該嘗試內聯您的函數。 仍然可以獲取函數的地址,在這種情況下,編譯器還需要發出非內聯版本。

例如:

#include <stdio.h>

inline void f() {
    printf("hello\n");
}

int main() {
    f();
    void (*g)() = f;
    g();
}

上面的代碼打印兩次hello

我的gcc編譯器(帶-O )發出如下代碼:

_main:
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %ebx
        subl    $20, %esp
        call    ___i686.get_pc_thunk.bx
"L00000000002$pb":
        leal    LC0-"L00000000002$pb"(%ebx), %eax
        movl    %eax, (%esp)
        call    L_puts$stub        ; inlined call to f()
        call    L__Z1fv$stub       ; function pointer call to f() (g is optimised away)
        movl    $0, %eax
        addl    $20, %esp
        popl    %ebx
        popl    %ebp
        ret

正如您所看到的,首先調用puts()然后調用L__Z1fv() (這是f()的錯位名稱)。

如果需要,內聯函數具有地址。 標准只說:

具有外部鏈接的內聯函數在所有翻譯單元中應具有相同的地址。

沒有矛盾。 在調用內聯函數的部分中,可以內聯其代碼。 在使用指向函數的指針的部分中,可以創建非內聯版本以具有地址。

函數的內聯擴展沒有地址,但如果該函數有靜態變量,則該變量確實有一個地址。 靜態變量基本上只是一個全局變量,其名稱僅在本地可見(即,在定義它的范圍內)。 內聯函數中的其他變量可能在堆棧上分配(就像它們沒有內聯展開一樣),或者它們可能只存在於機器寄存器中。 重要的是它們仍然是單獨的變量,並且必須像函數一樣完全沒有內聯擴展(例如,不同於宏,需要極其小心以防止多個評估引起問題)。

它們可能在某些呼叫站點內聯,但它們仍然作為地址空間中的正常功能而存在。

我認為你混淆了內聯函數對象代碼的位置,以及內聯的含義。 通常,我們將內聯函數可視化為放置在源代碼級別的調用函數內。 本書所說的是變量名稱,包括內聯函數中靜態的使用,被視為函數實際上是典型的獨立函數。

此外,使用inline關鍵字處理函數並不保證它們將被內聯,並且對於它們不能的情況(例如在需要地址時),將生成非內聯版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM