2

std::function をコールバック ハンドラとして使用しようとしています。

このような、

void some_job( int arg1, std::function<void(int)> & callback )
{       
   callback( process(arg1) );
}

この例では、参照渡しを使用しました。

しかし問題は、関数がプログラムの非同期コンテキストで実行されるため、std::functionオブジェクトがまだ存在することを保証できないことです。callback

そのため、関数オブジェクトのライフサイクルを管理する必要があり、そのために 2 つの方法を考えました。

  1. 値渡し(コピー)の使用

  2. 使用してstd::shared_ptr

私のシステムでは のサイズがstd::function24 バイトに固定されており、std::shared_ptr8 であることを知っています。

ただし、コピーするstd::shared_ptrと、参照カウンターを管理する追加のオーバーヘッドが発生します。(さらに、 の shared_ptr オブジェクトを作成するスマートできちんとした方法が見つかりませんstd::function。)

どちらの方法でパフォーマンスが向上しますか?

4

1 に答える 1

3

プログラムのタイムクリティカルな部分にいて、24バイトまたは8バイト+共有オーバーヘッドのどちらをコピーする方が速いか心配な場合は、両方を実装し、プロファイラーを使用して、特定の部分でどちらが優れているかを見つける必要があります。シナリオ。また、そのような場合は、内部に隠されている可能性のある仮想呼び出しをバイパスする、まったく異なるアプローチも検討する必要がありますstd::function::operator()

それ以外の場合は、パラメーターを値で取得し、オプティマイザーにその仕事を任せます。

于 2013-02-20T08:16:56.600 に答える