回答
gcc的-finline_functions
選項聽起來可能做你想要什麼。這裏是some documentation。如果你的makefile定義了一個CFLAGS變量,那將是放置它的地方。
感謝您的回答。我會嘗試並繼續更新。 – thetna 2010-05-20 21:37:00
我嘗試了你在這裏提到的方式。它只適用於單一的soruce代碼文件。那麼彼此包含的多個源代碼文件如何? – thetna 2010-05-29 13:29:18
@thetna:如果不知道你的項目是如何構建的,以及迄今爲止嘗試過的東西,那很難說更多的東西。但是MichałTrybus提出了一個很好的觀點 - 函數內聯不能跨翻譯單元使用;函數定義必須在每個源文件中可用,例如將函數定義放在.h文件中並將其包含在每個.c文件中。如果你的項目還沒有像這樣構建,那麼-finline_functions選項不會有太大的作用,正如你所看到的......你需要重新安排代碼。 – 2010-05-29 19:16:34
有幾個方法可以使GCC內聯函數。其中之一是選項-finline-functions
,這將使gcc內聯「簡單」功能。編譯器使用一些啓發式來確定函數是否足夠小以便內聯。但是,用戶通過-finline-limit
可以控制該算法。閱讀gcc手冊以找到您需要的實際值。
當內聯函數,你應該記住,顯然不是所有的功能都可以被內聯(最簡單的例子是遞歸函數),編譯器可以內聯只能在同一翻譯單元中定義的函數。此外,值得一提的是,-finline-functions
默認爲-O3
,所以只有-O3
有時可能是您的解決方案。
在生成文件中,您將有權利選擇加入到GCC的所有呼叫。在一個寫得很好的makefile中,你可以很容易地發現其他gcc選項的變量,你可以簡單地放置你自己的變量。
感謝您的回答。我會嘗試並繼續更新。 – thetna 2010-05-20 21:36:29
我試過你在這裏提到的方式。它只適用於單一的soruce代碼文件。那麼彼此包含的多個源代碼文件如何? – thetna 2010-05-29 13:28:31
如果某些源文件確實包含在用'-finline-functions'編譯的源文件中,那麼編譯器(和您,通過使用適當的選項)允許的所有內容都應該正確地內聯。但是,在實際情況中,文件是單獨編譯的,並且在一個文件中定義的函數不會內聯在另一個文件中,因爲編譯後者時編譯器不知道其定義。確保函數始終內聯的唯一方法是將整個定義添加到頭文件中,並確保它包含在使用該函數的所有文件中。你不能用Makefile來完成。 – 2010-05-29 13:44:26
- 1. C,內聯函數和GCC
- 2. PHP推薦:內聯,內部或外部
- 3. GCC預處理器內聯函數名
- 4. GCC內聯C++函數沒有「內聯」關鍵字嗎?
- 5. 內聯asm:推函數參數
- 6. 推薦的GCC版本構建標誌
- 7. 使用SSE2內在函數和gcc內聯彙編器
- 8. 如何擺脫GCC中不推薦使用的函數中的棄用警告?
- 9. 推薦調試Clojure函數的方法?
- 10. 不推薦使用:mysql_connect()函數:注意
- 11. Python不推薦使用的函數
- 12. 爲什麼gcc沒有爲這個函數決定內聯或者不內聯?
- 13. Sublime 3 autocomplete在Julia中推薦模糊的內部函數
- 14. 數學SVD推薦系統,內環路
- 15. 內聯函數
- 16. 內聯函數
- 17. 內聯函數
- 18. 傳遞給gcc內聯彙編程序的調用const函數地址(avr-gcc)
- 19. 推薦PHP數組()
- 20. 推薦元數據?
- 21. 數據庫推薦
- 22. 在gcc內聯彙編中調用一個函數
- 23. g ++/gcc在展開遞歸內聯函數時有多有效?
- 24. 從GCC中的單獨文件內聯函數
- 25. gcc內聯彙編jmp地址;裸函數
- 26. C++異常,GCC和「內聯函數」標誌
- 27. 如何使用gcc從libc內聯函數?
- 28. gcc - 2個版本,內聯函數的不同處理
- 29. 導軌4:推薦模型關聯
- 30. 在聯盟中推薦boost :: variant
從您的評論下面,看來你需要調整你的項目相當多,使這項工作。退後一步可能是好事,並考慮這是否真的有必要。你有沒有分析你的程序,並確定函數調用開銷顯着減慢?如果不是,那麼爲了函數內聯而大規模地重構你的程序可能是一個非常糟糕的主意。正如Knuth所說:我們應該忘記小效率,大約97%的時間:**不成熟的優化是所有邪惡的根源**。 – 2010-05-29 19:26:31