std::function の実装方法: 型消去とヒープ割り当て
std::function の重要な実装の詳細は、その機能です。ラムダ式を含む呼び出し可能なものをラップします。ラムダのサイズはさまざまですが、std::function は固定サイズを維持します。これは、type-erasure と呼ばれる手法によって実現されます。
std::function
struct callable_base { virtual int operator()(double d) = 0; virtual ~callable_base() {} }; template <typename F> struct callable : callable_base { F functor; callable(F functor) : functor(functor) {} virtual int operator()(double d) { return functor(d); } };
の簡略化された例を見てみましょう。ここで、std::function は次のようになります。 unique_ptr を基本の callable_base 型に変換します。使用される一意のファンクターごとに、呼び出し可能な派生型
std::function のコピーは、状態を共有するのではなく、内部呼び出し可能オブジェクトのコピーをトリガーします。これは、可変キャプチャ変数の値がインクリメントされるテストから明らかです。
int value = 5; std::function<void()> f1 = [=]() mutable { std::cout << value++ << '\n'; }; std::function<void()> f2 = f1; // Prints 5 f1(); // Prints 5 (copy of mutable state) f2();
したがって、 std::function は、型消去とヒープ割り当てを使用して、さまざまなサイズの呼び出し可能オブジェクトを効率的にラップします。ヒープ割り当ては、ラップされた呼び出し可能オブジェクトに基づいて動的型をインスタンス化するために使用され、std::function 自体の固定サイズを確保します。
以上がさまざまなサイズの呼び出し可能オブジェクトをラップしているにもかかわらず、「std::function」はどのようにして固定サイズを実現するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。