簡體   English   中英

C ++內聯函數強制其參數被復制?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM