std::function: Implementierung und Speicherverwaltung
Die std::function-Klasse dient als generischer Wrapper für aufrufbare Objekte und ermöglicht die Speicherung und Aufruf jeglicher aufrufbarer Art. Während Lambda-Ausdrücke häufig als Klassen mit Funktionsaufrufoperatoren implementiert werden, kann ihre Größe abhängig von der Anzahl der referenzierten Variablen erheblich variieren.
Im Gegensatz dazu muss std::function eine feste Größe beibehalten und gleichzeitig aufrufbare Elemente verschiedener Art aufnehmen , einschließlich Lambdas. Seine Implementierung basiert auf der Typlöschung, bei der eine Basisklasse erstellt wird, die aufrufbare Entitäten darstellt. Für jeden spezifischen aufrufbaren Typ, der mit std::function verwendet wird, wird eine abgeleitete Klasse erstellt und dynamisch instanziiert.
Betrachten Sie beispielsweise eine vereinfachte Implementierung von std::function für Double-to-Int-Funktionen:
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) {} int operator()(double d) { return functor(d); } };
Das std::function-Objekt würde einen unique_ptr für die Basisklasse enthalten. Wenn eine std::function mit einem bestimmten aufrufbaren Element erstellt wird, wird eine abgeleitete Klasse erstellt und auf dem Heap instanziiert. Das std::function-Objekt selbst behält eine feste Größe, während der Speicher für das aufrufbare Objekt dynamisch zugewiesen wird.
Was die Kopiesemantik betrifft, verwaltet jedes std::function-Objekt seine eigene Kopie der aufrufbaren Entität. Dies geht aus dem folgenden Test hervor:
fun f1 = [=]() mutable { std::cout << value++ << '\n' }; fun f2 = f1; f1(); f2(); f3();
Die Ausgabe des Programms zeigt, dass f2 und f3 jeweils separate aufrufbare Objekte verwalten, was dazu führt, dass unterschiedliche inkrementierte Werte gedruckt werden. Daher verwaltet std::function den Speicher für seine aufrufbaren Objekte und stellt gleichzeitig sicher, dass Kopien von std::function-Objekten ihre eigenen unabhängigen aufrufbaren Entitäten behalten.
Das obige ist der detaillierte Inhalt vonWie verwaltet „std::function' Speicher und aufrufbare Objekte?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!