2010-05-20 89 views
0

我不知道它有多可行,這個問題在這裏有多明智。推薦gcc內聯函數

是否有任何變化,我們可以在Makefile中做出推薦GCC內聯的所有功能,雖然功能沒有在源文件中的聲明中內聯還是行不通的。

+0

從您的評論下面,看來你需要調整你的項目相當多,使這項工作。退後一步可能是好事,並考慮這是否真的有必要。你有沒有分析你的程序,並確定函數調用開銷顯着減慢?如果不是,那麼爲了函數內聯而大規模地重構你的程序可能是一個非常糟糕的主意。正如Knuth所說:我們應該忘記小效率,大約97%的時間:**不成熟的優化是所有邪惡的根源**。 – 2010-05-29 19:26:31

回答

1

gcc的-finline_functions選項聽起來可能做你想要什麼。這裏是some documentation。如果你的makefile定義了一個CFLAGS變量,那將是放置它的地方。

+0

感謝您的回答。我會嘗試並繼續更新。 – thetna 2010-05-20 21:37:00

+0

我嘗試了你在這裏提到的方式。它只適用於單一的soruce代碼文件。那麼彼此包含的多個源代碼文件如何? – thetna 2010-05-29 13:29:18

+0

@thetna:如果不知道你的項目是如何構建的,以及迄今爲止嘗試過的東西,那很難說更多的東西。但是MichałTrybus提出了一個很好的觀點 - 函數內聯不能跨翻譯單元使用;函數定義必須在每個源文件中可用,例如將函數定義放在.h文件中並將其包含在每個.c文件中。如果你的項目還沒有像這樣構建,那麼-finline_functions選項不會有太大的作用,正如你所看到的......你需要重新安排代碼。 – 2010-05-29 19:16:34

3

有幾個方法可以使GCC內聯函數。其中之一是選項-finline-functions,這將使gcc內聯「簡單」功能。編譯器使用一些啓發式來確定函數是否足夠小以便內聯。但是,用戶通過-finline-limit可以控制該算法。閱讀gcc手冊以找到您需要的實際值。

當內聯函數,你應該記住,顯然不是所有的功能都可以被內聯(最簡單的例子是遞歸函數),編譯器可以內聯只能在同一翻譯單元中定義的函數。此外,值得一提的是,-finline-functions默認爲-O3,所以只有-O3有時可能是您的解決方案。

在生成文件中,您將有權利選擇加入到GCC的所有呼叫。在一個寫得很好的makefile中,你可以很容易地發現其他gcc選項的變量,你可以簡單地放置你自己的變量。

+0

感謝您的回答。我會嘗試並繼續更新。 – thetna 2010-05-20 21:36:29

+0

我試過你在這裏提到的方式。它只適用於單一的soruce代碼文件。那麼彼此包含的多個源代碼文件如何? – thetna 2010-05-29 13:28:31

+0

如果某些源文件確實包含在用'-finline-functions'編譯的源文件中,那麼編譯器(和您,通過使用適當的選項)允許的所有內容都應該正確地內聯。但是,在實際情況中,文件是單獨編譯的,並且在一個文件中定義的函數不會內聯在另一個文件中,因爲編譯後者時編譯器不知道其定義。確保函數始終內聯的唯一方法是將整個定義添加到頭文件中,並確保它包含在使用該函數的所有文件中。你不能用Makefile來完成。 – 2010-05-29 13:44:26