一個相當簡單的問題......現在的編譯器往往會做大量的優化。他們是否也從最終輸出中刪除未使用的功能?未使用的函數是否被優化了?
回答
這取決於編譯器。 Visual C++ 9可以這樣做 - 未使用的static
函數在編譯階段被刪除(甚至有一個C4505 warning),在鏈接階段depending on linker settings可以刪除具有外部鏈接的未使用函數。
相當多的時間,是的。它通常被稱爲鏈接器剝離。
這一切都取決於編譯器及其設置(內置「調試」配置的代碼通常未優化),以及代碼本身和行星對齊。
潛在的問題是:你不應該擔心那些東西。相信你的編譯器。
說到MS,它是鏈接器,它在鏈接階段處理此問題,並且編譯器可能會警告您未使用的靜態函數(文件範圍)。如果您希望鏈接器刪除未使用的函數,請使用/OPT:REF選項:
使用gcc如果啓用優化,它可以刪除未使用的函數和死代碼。
更多關於GCC的優化,可以發現here
許多編譯器做的,但是這取決於具體的實施。調試版本通常會包含所有功能,以便在調試器中調用或檢查它們。由於我不完全瞭解(*)的原因,許多嵌入式系統編譯器將包含對象文件中的所有功能(如果它們包含任何功能),但會完全省略完全不使用的任何對象文件。
請注意,在支持Reflection的語言(例如Java,C#,vb.net等)中,給定一個函數的名字,可以在運行時創建對它的引用,即使代碼中沒有引用。例如,一個例程可以接受來自控制檯的字符串,以某種方式使用該字符串,並以該名稱生成對函數的調用。編譯器或鏈接器無法知道可能會如此生成哪些名稱,因此無法知道可以安全地從代碼中省略哪些函數。但是,在C或C++中不存在這樣的困難,因爲沒有定義的方法讓代碼創建對函數,變量或常量的引用,而不在代碼中存在明確的引用。有些實現可能會安排一些事情,以便連續聲明的常量或變量將被連續存儲,因此可以通過向先前聲明的一個偏移量添加偏移量來創建對後面聲明的引用的引用,但這些技巧的行爲是明確的不受C或C++標準的保證。 (*)我知道它使得編譯和鏈接變得更加容易,但是今天的計算機應該沒有運行更復雜的編譯和鏈接算法的麻煩,而這種算法比過去幾十年來的實踐要容易。如果沒有別的,預編譯/鏈接階段可以使用兩步預編譯/預鏈接/編譯/鏈接方法生成所使用的事物列表,然後在「真實」編譯/鏈接階段省略那些不是。
如果使用/Gy
進行編譯並鏈接到/OPT:REF
,MSVC(Visual Studio編譯器/鏈接器)可以執行此操作。
如果您使用-ffunction-sections -fdata-sections
進行編譯並鏈接到--gc-sections
,GCC/binutils可以執行此操作。
不知道其他編譯器。
請注意,'/ OPT:REF'會導致非標準行爲:它將優化僅取得地址的函數,以使地址變爲無效。 GCC不會發生這種情況。 – rubenvb 2016-08-10 05:29:38
一般來說,答案是:
是:未使用static
功能。
編號: 未使用的全局可用函數。
編譯器不知道其他編譯單元是否引用它。而且,大多數對象模塊類型不允許在編譯後刪除函數,也不提供鏈接器判斷是否存在內部引用的方法。 (鏈接器可以分辨出是否有外部。)有些鏈接器可以做到這一點,但很多事情都可以解決這個問題。
當然,它自己的模塊中的函數不會被任何鏈接器不必要地加載,除非它是共享庫的一部分。 (因爲它在將來可能會在運行時被引用,很明顯。)
所有你需要的是這樣的__declspec(selectany)變量或函數這裏
檢查http://msdn.microsoft.com/en-us/library/5tkz6s71%28v=vs.71%29.aspx
它將刪除,如果函數或變量它沒有在代碼中引用
- 1. 在Rust中空函數是否被優化了?
- 2. 是否允許Python優化函數定義以消除未使用的代碼?
- 3. SqlCommand是否優化了參數化的sql語句?
- 4. JSF:是否優化了資源組件?
- 5. 是否優化了空塊? C#
- 6. ilmerge是否優化了輸出?
- 7. 優化窗函數的使用指數
- 8. JavaScript調用中的函數是否優化?
- 9. 使用Apache Commons優化函數數學
- 10. 未找到Webpack優化構造函數
- 11. 是否優化了XML文件中的所有參數?
- 12. 如果沿函數傳遞Rvalue引用是否優化?
- 13. 編譯器是否可以識別和優化常用函數?
- 14. JIT優化器是否優化乘法?
- 15. 用numba優化python函數
- 16. 使用rank函數優化sql查詢
- 17. 使用函數優化設置Pandas列
- 18. 如何查找函數是否未被調用?
- 19. C++如何優化一個經常被調用的函數?
- 20. C++函數優化
- 21. 優化凹函數
- 22. 優化realloc函數
- 23. 優化plpgsql函數
- 24. 函數是否被多次調用?
- 25. 函數表示法是否被棄用?
- 26. 檢查函數是否被調用?
- 27. 檢查函數是否被調用
- 28. GAE是否針對數據庫繁重的應用進行了優化?
- 29. Scala(或JVM)是否曾經優化(函數)對象?
- 30. 函數的調試優化
如果您有一些外部要求,即可執行文件包含某個未使用的符號,則必須擔心。沒有得到解決。 – 2011-06-23 14:01:40
@Tomalak我同意,有時知道你的編譯器輸出是必要的。但對大多數情況來說,這並不重要。 – 2011-06-23 14:03:36
當然。另一方面,瞭解您的工具以及如何正確使用它們。 – 2011-06-23 14:06:32