2011-10-24 14 views
3

我有一個很大的實用功能類。這些功能非常小,我希望他們內聯。源文件中的內嵌

問題是它們都在源文件中,應該保留在源文件中,不要移動到頭文件(所以我不需要每次更改時都重新編譯所有內容)。

如果我將它們標記爲直列我得到沒有找到

有沒有辦法讓他們在線

符號或做我需要盲目信任的鏈接時優化?
我需要的代碼可以在clang 3和gcc 4.6之間移植,但基於編譯器的#define則可以(因此只有在其中一個編譯器中才能回答的問題也可以)。

+4

所以,基本上,你想要魔法。 –

+0

@ R.MartinhoFernandes:不,我想要一個可以複製粘貼的鏈接器。 – Dani

+0

@Dani:那是LTCG/LTO。 –

回答

1

您需要強制內聯函數 - 將其放入類定義中。

+0

我說我不能那樣做 – Dani

+0

和-1呢? o_O你想要在A中定義的函數在B中內聯。在你改變這個函數後,你到底怎麼不會重新編譯B? – iehrlich

+0

我沒有投票給你,它可以通過鏈接器在彙編中的鏈接時間完成。 – Dani

1

一個選項可能是將內聯函數放在預編譯頭文件中,這會加快編譯速度。但由於內聯函數的性質,所有使用它們的地方都必須重新編譯。

http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

+0

如果這些功能經常發生變化,將其放入PCH中可能會減慢編譯速度。 –

+0

@ R.MartinhoFernandes我會說這取決於。我已經看到了預編譯頭文件(一般常用的)和並行編譯的非常好的結果。這聽起來像速度是這裏的問題,所以這些是我使用GNU工具時的建議。 – epatel

+0

問題是PCHs是不會經常改變的東西。該死的東西永遠需要重新編譯。這是我的經驗。 –

3

將在.inl文件的執行情況。只有必要的.cpp檔案#include吧。這種方式更改爲執行(觸摸.inl文件)觸發器重新編譯只依賴.cpp文件。對定義所做的更改(觸摸.h文件)會觸發重新編譯使用該聲明的所有文件。

這是內聯函數和模板實現的常見做法。 .inl文件應基本上被視爲「包含的cpp」文件。

+0

這並不是壞建議,但對編譯時成本沒有多大幫助。我想你可以有一個'.inl'文件每個功能,但這將是更多的維護拖動比它值得,恕我直言。 – zwol

5

[這些]功能非常小,我希望他們內聯。 [但是]我不想在每次更改時重新編譯所有內容。

你不能同時擁有這兩種東西。如果函數內聯,則別無選擇,但在其更改時重新編譯其所有調用者。這就是內聯的工作原理。即使您使用鏈接時優化程序在鏈接時自動執行此操作,您仍需支付重新處理所有呼叫者的編譯時成本。順便說一句,AFAIK既沒有gcc 4.6也沒有clang 3有鏈接時優化器,這些鏈接時優化器都是劃傷的。

編者的話:沒有編譯器,我知道有啓發式,足以使手動inline註釋是不必要的,但。即使是VS2010,我在評論中提到的的鏈接時優化器的示例,仍然需要相當多的關於內聯內容的建議。

+0

由於鏈接器可以修改文件中的符號位置,所以我非常肯定它可以在符號指示的位置將符號粘貼到另一個符號的中間。 – Dani

+0

GCC的LTO據說*工作*。 –

+0

@Dani:但這不會真的加快編譯會多嗎?每當這些事情發生變化時,仍然需要爲每個呼叫者完成這項工作。 –

3

如果你想要一個函數爲inline'd你必須將它放在一個頭文件中,除非它只用在同一個源文件中。原因是編譯器需要實際的函數定義,以便將定義「內聯」放置在被調用的任何位置,然後進行編譯。

你可以找到更多的信息:herehere