2
A
回答
1
C靜態內聯函數在運行時是否具有身份?
如果編譯器至少選擇一次不內聯它,或者如果您取得該函數的地址,則靜態內聯函數在編譯單元中具有標識。
取得的地址僅在當前編譯單元(.c
文件)中有效。在另一個編譯單元(另一個.c
文件)中,編譯器會給你一個不同的地址。
與編譯器可見的任何其他函數一樣,函數中的代碼可能完全或部分複製到由編譯器生成的彙編代碼中的各個位置。
從當前編譯的.c
文件中看不到任何其他.c
文件中的靜態內聯函數(與任何靜態函數一樣)。
我應該關心該構造的命名衝突嗎?
只有當你需要在頭文件中定義的靜態內聯函數的地址,並執行以下操作:
- 靜態內聯函數
f
在文件a.h
a.h
定義爲C包括文件x.c
和y.c
x.c
需要的f
並將其存儲在地址轉換成全局變量f_addr
y.c
需要的f
的地址和用於身份,進行比較,以存儲在f_addr
- 所述比較將所述
false
的結果值儘管事實上在不同的抽象級別它是非常相同的功能f
如果函數是在.c文件中定義的?它是一樣的嗎?
從C編譯器的角度來看,它與在頭文件中定義函數和在.c文件中包含頭文件完全相同。編譯器不知道頭文件,它只看到一個連續的編譯單元。頭文件是使用C語言的程序員腦海中存在的概念 - 從C編譯器的角度來看,這個概念並不存在。
2
內聯函數的命名與非內聯函數的命名一樣重要。該名稱由編譯器用於標識要調用的函數。程序員通過閱讀代碼也可以使用它來理解函數的作用。
在運行時,函數的名稱不相關。
還要注意的是inline
關鍵字只有提示編譯器。儘管有inline
關鍵字,該函數實際上可能不會內聯。同樣,未標記爲inline
的函數可能仍由編譯器內聯。
1
您可能不在意命名內聯函數的衝突,但我保證編譯器會!
內聯是編譯期間的後期操作 - 編譯器首先需要確定程序的調用結構,這需要編譯器正確解析所有已命名的調用。
在運行時,你可以不知道任何當前正在執行的函數的名稱不明確編碼某種魔力,以確定它 - c
不反射。
正如Mark指出的那樣,inline關鍵字只是一個提示 - 如果編譯器決定從顯式調用獲得更好的性能,編譯器可以自由忽略它。
相關問題
- 1. 內聯函數和靜態內聯函數之間的區別
- 2. 內聯函數調用靜態內聯函數
- 3. 類中的靜態內聯函數
- 4. libc中的靜態內聯函數
- 5. 調用靜態內聯函數
- 6. 靜態函數,內聯和模板?
- 7. 靜態局部變量C99靜態內聯函數
- 8. 內聯靜態函數和靜態變量
- 9. 訪問靜態變量時內聯函數和靜態內聯函數之間的區別
- 10. 函數本地靜態變量是否阻止函數內聯?
- 11. C靜態內聯函數調用外部函數動機
- 12. 錯誤由於早期非靜態非內聯函數的靜態線版本
- 13. 如何使用非靜態函數內部靜態函數
- 14. gcc靜態鏈接程序能否從靜態庫中正確內聯函數?
- 15. 定義靜態二維數組與內聯函數
- 16. g ++無法解析靜態庫中的非內聯函數
- 17. 內聯成員函數使用的靜態全局變量
- 18. 的openmp,內聯函數,和靜態變量(純C)1
- 19. 內聯函數靜態常量是唯一的嗎?
- 20. 靜態函數靜態函數
- 21. 靜態內聯方法?
- 22. C#靜態內聯方法參數
- 23. Objective-C靜態內聯NSString數組
- 24. 內聯代碼比Java中的函數調用/靜態函數更慢
- 25. 靜態模板函數可以通過編譯器內聯嗎?
- 26. 內聯和靜態函數調用運營商
- 27. 如何在內聯函數中聲明一個靜態變量?
- 28. 你可以內聯靜態成員函數嗎?
- 29. 靜態庫。導入和導出內聯函數
- 30. C編譯器優化(gcc):自動內聯非靜態函數vs靜態函數
最後一個問題的答案真的很好,謝謝! – Eonil 2012-03-01 15:15:15