1

Boost :: bindドキュメントの状態:

デフォルトでは、bindは提供された関数オブジェクトのコピーを作成します。boost::refおよびboost::crefを使用して、コピーではなく、関数オブジェクトへの参照を格納することができます。

メンバー関数へのポインターを使用してboost::bindを使用すると、コードに過剰なニュースと削除が表示されます。boost :: bind(&classname :: functionname、...)が関数のコピーを作成するかどうかについては、ドキュメントがわかりません。

あるいは、質問が意味をなさず、メンバー関数を関数オブジェクトに変換しているので、明らかに関数オブジェクトを新しくする必要があります。

だから私の質問は、メンバー関数にバインドして、newとdeleteを回避する方法はありますか?

4

3 に答える 3

1

コピーされるのはそのメソッドへのポインタなので、new/deleteは関係しません。返されるのは、ある時点で作成および破棄される関数オブジェクトですbindが、動的メモリ割り当てはありません。

于 2012-07-05T09:49:32.453 に答える
1

私の実験(ブースト1.49)によると、boost::bind独自の実装にダイナミックメモリを使用していません。このコードで

#include <boost/bind.hpp>

int f(int a , int b) {
  return a>b ? a+b : a-b;
}

int main()
{
  auto a = boost::bind(f, _1, 2);
  return a(0);
}

gdbのバリアントを壊してみましたoperator newが、起動しませんでした。したがって、実際には、バインドされた引数(これらの2つのスニペットの出力を比較)または呼び出し引数boost::bindのいずれかのコピーを作成していることが問題であると思われます。これらの中から、コピー中にメモリを割り当てることができるものを探し、それを取り除こうとします。

C ++ 11コンパイラを使用している場合は、boost::bind完全に回避して、代わりにラムダ関数を使用できます。例は次のように変換されます

auto a = [&](int a1) { return f(a1, 2); }

これは、オブジェクトを値でキャプチャする場合にのみコピーされます。

編集:投稿したコードを使用して、問題の行を次のように変更してみてください

TConstIterator pIt = std::find_if(rtContainer.begin(), rtContainer.end(), 
  boost::bind(&TValueType::bSameSocket, boost::cref(rtData), _1));
                                        ^^^^^^^^^^^

それはそれをより良くするはずです。そうでない場合は報告してください。

于 2012-07-06T10:55:00.250 に答える
0

find_ifの述語として機能する関数オブジェクトを作成するなどのコードでboost::bindを使用するかどうかを知る限り、関数オブジェクトが新しく削除されたため、コードの実行が遅くなりました。

私の質問は、メンバー関数にバインドして、newとdeleteを回避する方法はありますか?

私は、メンバー関数ポインターを介してメンバー関数を呼び出してリストを反復処理することにより、boost::bindを回避しました。

メンバーポインタ関数の型は、リストとその格納されたデータ型のテンプレートパラメータから派生しますが、型がテンプレート化されているかどうかに関係なく、同じ手法が機能します。

このソリューションにより、特定のアクションに対するユーザーの応答の認識が5分から効果的に即座に減少しました。

于 2012-07-06T10:26:23.820 に答える