Heim >Backend-Entwicklung >C++ >Wie erreicht „std::function' vielseitige Aufrufbarkeit bei konsistenter Größe?
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!