2017-03-13 9 views
0

可能です私は、この関数を定義した関数のバージョンを提供します。したがって、2番目のケースではヘッダは効率的ですが、T=intthis is inefficientとなります。これらの2つのタイプのみを例として使用しています。は値によって、参照により両方が

だから、より良い解決策を持つ別の関数を定義することになります。

template <typename T> 
T foo(){ 
    T result; 
    //some very complicate stuff 
    return result; 
} 

を、ユーザーが呼び出すためにどのバージョンを決めましょう、しかし、私たちはどのように機能して//some very complicate stuffの全体のコードを呼び出すために避けていますか?コンパイラの最適化では

+0

整数参照での操作は比較的効率的ではありませんが、それほどコストはかかりません。これは単に整数をコピーすることも安いからです。 –

答えて

3

が、T=intで、これは非効率的

では、問題は、非常に可能性は決して有効にしない - それは問題でプロファイリングを介して検出することができ、別々に処理例を。


が、どのように我々は、関数で//some very complicate stuffの全体のコードを呼び出すために避けていますか?

まあ、それは余分なパラメータとして関数オブジェクトを渡すためにあなたを必要とする回避する1つの可能な方法:

template <typename T, typename F> 
void foo (T &result, F&& complicated_stuff){ 
    std::forward<F>(complicated_stuff)(); 
    result = //something 
} 

template <typename T, typename F> 
T foo(F&& complicated_stuff){ 
    T result; 
    std::forward<F>(complicated_stuff)(); 
    return result; 
} 

それはその意志の良いソリューションです。コンパイラによってインライン化され、最適化されている可能性が高いですが、参考にしてプリミティブ型を渡すことを避けようとしているのであれば、どういうことでしょうか? 機能オブジェクトについては、転送参照がここに追加されます。


したがって、fooという単一のバージョンのみを使用することを強くお勧めします。値によって返されるものはより慣用的なC++ 11であり、RVOとの移動セマンティクスのために参照を取るものよりも遅くならない。

+0

あなたの役に立つ答えをありがとう。ちょうど1つの質問:なぜ移動セマンティクスは 'return'アプローチを他のものより遅くしてはならないのですか? – justHelloWorld

+1

@justHelloWorld:最良の場合のシナリオでは、RVO/NRVOを取得します.RVO/NRVOは移動コンストラクタを呼び出すことさえありません。最悪の場合のシナリオでは、移動コンストラクタを呼び出します。このコンストラクタは、ほとんどのデータ構造(1〜2のポインタ代入で構成されることが多いため)のパフォーマンスに関しては無視できます。 –

+0

ご清聴ありがとうございます – justHelloWorld

関連する問題