2

私は最近、次のような多くの定義を持つヘッダー ファイルを整理することにしました。

// 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);

どこにコピーするかを決定するのはオプティマイザだけですか、それとも標準はそれについて何かを言っていますか?

4

1 に答える 1

11

インライン化が関数パラメーターをコピーしない場合、次の動作は悪くないでしょうか?

パラメータを変更するとコピーされます。そして機能のinline有無は関係ありません。

どこにコピーするかを決定するのはオプティマイザだけですか、それとも標準はそれについて何かを言っていますか?

はい、これはオプティマイザのタスクです。標準は、実装ではなく動作のみに言及しています(実装に関するいくつかの参照がありますが、それらのほんの一部です)。また、inlineそれ自体は関数がインライン化されることを保証しません。逆に、オプティマイザは として宣言されていない関数をインライン化する場合がありますinline
本当に重要なことは、値で渡されたパラメーターは関数呼び出しによって変更されないということです。宣言されているinlineかどうか、実際にインライン化されているかどうかは関係ありません。
最近のコンパイラは最適化に関して人々よりもはるかに賢いことが多いため、inline通常は「この関数をインライン化する」のではなく、「この関数は翻訳単位間で複数の (ただし同一の!) 定義を持つ可能性がある」ことを意味します。

于 2013-04-25T16:47:39.997 に答える