1. ホーム
  2. c++

std::functionをコピーすべきか、それとも常に参照を取ることができるのか?

2023-10-30 07:13:23

質問

私のC++アプリケーション(Visual Studio 2010を使用)では、次のようなstd::functionを格納する必要があります。

class MyClass
   {
   public:
      typedef std::function<int(int)> MyFunction;
      MyClass (Myfunction &myFunction);
   private:
      MyFunction m_myFunction;    // Should I use this one?
      MyFunction &m_myFunction;   // Or should I use this one?
   };

見ての通り、コンストラクタの中で関数の引数を参照として追加しています。

しかし、私のクラスで関数を格納する最良の方法は何でしょうか?

  • std::function は単なる関数ポインターであり、関数の「実行コード」はメモリ内に留まることが保証されているので、関数を参照として格納できますか?
  • ラムダが渡され、呼び出し元が戻った場合に備えて、コピーを作成する必要がありますか?

私の直感では、参照(const参照でも)を保存するのは安全だと思います。 私は、コンパイラーがコンパイル時にラムダのコードを生成し、アプリケーションが実行されている間、この実行可能コードを「仮想」メモリに保持することを期待します。 したがって、実行コードは決して「削除」されることはなく、私は安全にそれへの参照を保存することができる。 しかし、これは本当に正しいのでしょうか?

どのように解決すればよいのでしょうか。

<ブロッククオート

std::function は単なる関数ポインタであり、関数の「実行コード」はメモリ上に残ることが保証されているので、関数を参照として格納することはできますか?

std::function は単なる関数ポインタではありません。これは任意の呼び出し可能なオブジェクトのラッパーであり、そのオブジェクトを格納するために使用されるメモリを管理します。他の型と同様に、参照を格納するのは安全です。 の場合のみ の場合のみ、参照を保存することが安全です。

参照を保存する正当な理由と、それが有効であり続けることを保証する方法がない限り、値で保存してください。

による受け渡し const への参照は安全であり、おそらく値を渡すよりも効率的です。非 const の参照は一時的なものを渡すことを妨げるので、ユーザーは直接ラムダを渡すことができないので、その結果 bind を除く他の呼び出し可能なオブジェクト、あるいは std::function<int(int)> を除く他の呼び出し可能なオブジェクトです。