[英]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.