ホームページ > バックエンド開発 > C++ > さまざまなサイズの呼び出し可能オブジェクトをラップしているにもかかわらず、「std::function」はどのようにして固定サイズを実現するのでしょうか?

さまざまなサイズの呼び出し可能オブジェクトをラップしているにもかかわらず、「std::function」はどのようにして固定サイズを実現するのでしょうか?

DDD
リリース: 2024-12-02 06:01:10
オリジナル
722 人が閲覧しました

How Does `std::function` Achieve Fixed Size Despite Wrapping Callables of Varying Sizes?

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 オブジェクトが一定のサイズを維持しながら、任意の呼び出し可能オブジェクトをラップできるようになります。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート