ホームページ >バックエンド開発 >C++ >`std::function` はどのようにして一貫したサイズで多用途な呼び出し可能性を実現するのでしょうか?

`std::function` はどのようにして一貫したサイズで多用途な呼び出し可能性を実現するのでしょうか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-02 11:49:14493ブラウズ

How Does `std::function` Achieve Versatile Callability with Consistent Size?

多用途な呼び出し可能性のための std::function の実装

std::function は、任意のタイプの呼び出し可能オブジェクトをカプセル化して保存する方法を提供します。固定サイズ。ラムダ式などの内容のサイズが異なるにもかかわらず、std::function は、型消去として知られる手法を通じてこの一貫性を実現します。

多様な呼び出し可能オブジェクトの型消去

型消去には、基本クラスで表される共通インターフェイスの作成が含まれます。 std::function の場合、callable_base クラスは、特定の呼び出し可能な型の派生クラスによって実装される仮想関数 Operator() を定義します。このアプローチにより、std::function が基本クラスへのポインターを格納できるようになり、任意の呼び出し可能オブジェクトをラップできるようになります。

各呼び出し可能オブジェクトには異なる実装がある可能性があるため、派生クラスは std::function が管理するメソッドを使用して動的に作成されます。ヒープ内の割り当て。

コピー動作と内部状態

の場合std::function をコピーすると、内部呼び出し可能エンティティは共有されずにコピーされます。この動作は、次のテストで明らかです。

int main() {
  int value = 5;
  typedef std::function<void()> fun;
  fun f1 = [=]() mutable { std::cout << value++ << '\n'; };
  fun f2 = f1;
  f1();                    // prints 5
  fun f3 = f1;
  f2();                    // prints 5
  f3();                    // prints 6 (copy after first increment)
}

f1 への最初の呼び出し後の増分は f2 に影響を与えません。これは、f2 が呼び出し可能なエンティティの独自のコピーを持っていることを示しています。

以上が`std::function` はどのようにして一貫したサイズで多用途な呼び出し可能性を実現するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。