[英]C++ does inlining a function force its parameters to be copied?
我最近決定整理一個頭文件,它有很多定義,如下所示:
// 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 ++中的答案做內聯函數會阻止復制嗎? “似乎暗示沒有復制,這個問題出現了:
如果內聯不復制函數參數,那么下面的行為會不會很糟糕?
inline void change_value( int i ) {
i++;
}
...
int x=5;
change_value(x);
assert(x==5);
它只是決定復制位置的優化器,還是標准對此有何說法?
如果內聯不復制函數參數,那么下面的行為會不會很糟糕?
如果您更改參數,它將被復制。 它與inline
功能無關。
它只是決定復制位置的優化器,還是標准對此有何說法?
是的,這是優化器的任務。 標准僅提及行為,而不是實現(有一些關於實現的參考,但只有少數參考)。 並且inline
本身不保證函數將被內聯,反之亦然,優化器可能會inline
未聲明為inline
函數。
真正重要的是函數調用不會改變按值傳遞的參數。 無論是否inline
聲明,無論是否實際內聯。
鑒於現在的編譯器在優化方面通常要聰明得多, inline
通常意味着不“內聯這個函數”,而是“這個函數可能在翻譯單元中有多個(但仍然相同!)定義”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.