2013-04-25 49 views
2

我最近決定要整理頭文件,它有像這樣有很多的定義:C++確實內聯函數強制其參數被複制?

// api.h 
template< typename T> 
inline void func(T param) 
{ 
    // stuff here 
} 

,所以我想將它變成的:

// api.h 
#include "api_details.h" 
template< typename T> 
inline void func(T param) 
{ 
    return details::func(param); 
} 

// api_details.h 
namespace details { 
    template< typename T> 
    inline void func(T param) 
    { 
     // stuff here 
    } 
} 

希望inline不會增加成本到我正在執行的額外副本。

雖然在「C++ do inline functions prevent copying?」的答案似乎暗示不會進行復制操作,這個問題就會出現:

如果內聯不會複製函數的參數,以後就不會了嚴重的行爲之後?

inline void change_value(int i) { 
    i++; 
} 

... 
int x=5; 
change_value(x); 
assert(x==5); 

是它只是決定在哪裏複製或沒有,或不標準要說的就是這些東西的優化?

+0

注意:聲明模板函數內聯是多餘的。 – Aleph 2013-04-25 16:47:11

+0

@AnotherTest真的嗎?我只是假設只有在有相關電話發出時纔會產生,而不是在線產生。但是聲明內聯任何東西當然不是硬性和快速的保證,所以也許這就是爲什麼? – 2013-04-25 16:50:17

+2

函數內聯時,必須保持調用的語義。也就是說,對「按值」參數的修改不會反映回「調用者」。 – 2013-04-25 16:50:30

回答

11

如果內聯不復制函數參數,那麼下面的行爲會不會很糟?

如果您更改參數,它將被複制。它與功能inline無關。

它只是優化器,決定在哪裏複製或不是標準說什麼?

是的,這是優化器的任務。標準只提到行爲,而不是實現(有一些關於實現的參考,但其中只有少數參考)。並且inline本身並不保證函數將被內聯,反之亦然,優化器可能會調用未被聲明爲inline的函數。
真正重要的是,通過函數調用不會改變通過值傳遞的參數。不管是否聲明它爲inline,也不管它是否被內聯或不內聯。
考慮到現在的編譯器往往比人們更優化的優化,inline通常意味着不是「內聯這個函數」,而是「這個函數可能在翻譯單元中有多個(但仍然是相同的)定義」。