Heim >Backend-Entwicklung >C++ >Wie erreicht „std::function' vielseitige Aufrufbarkeit bei konsistenter Größe?

Wie erreicht „std::function' vielseitige Aufrufbarkeit bei konsistenter Größe?

Susan Sarandon
Susan SarandonOriginal
2024-12-02 11:49:14494Durchsuche

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

Implementierung der std::function für vielseitige Callability

Die std::function bietet eine Möglichkeit, jede Art von Callable zu kapseln und zu speichern und gleichzeitig zu verwalten eine feste Größe. Trotz der unterschiedlichen Größe seiner Inhalte, wie z. B. Lambda-Ausdrücke, erreicht std::function diese Konsistenz durch eine Technik, die als Type-Erasure bekannt ist.

Type-Erasure for Diverse Callables

Typlöschung beinhaltet die Erstellung einer gemeinsamen Schnittstelle, die durch eine Basisklasse dargestellt wird. Im Fall von std::function definiert eine callable_base-Klasse einen virtuellen Funktionsoperator(), der von abgeleiteten Klassen für bestimmte aufrufbare Typen implementiert wird. Dieser Ansatz ermöglicht es std::function, einen Zeiger auf die Basisklasse zu speichern und so jede aufrufbare Klasse zu umschließen.

Da jede aufrufbare Klasse unterschiedliche Implementierungen haben kann, werden die abgeleiteten Klassen dynamisch erstellt, wobei std::function sie verwaltet Zuordnung innerhalb des Heaps.

Kopierverhalten und interner Zustand

Beim Kopieren von a std::function, die interne aufrufbare Entität wird kopiert und nicht geteilt. Dieses Verhalten wird im folgenden Test deutlich:

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)
}

Das Inkrement nach dem ersten Aufruf von f1 wirkt sich nicht auf f2 aus, was darauf hinweist, dass f2 über eine eigene Kopie der aufrufbaren Entität verfügt.

Das obige ist der detaillierte Inhalt vonWie erreicht „std::function' vielseitige Aufrufbarkeit bei konsistenter Größe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn