Heim > Backend-Entwicklung > C++ > Wie verwaltet „std::function' Speicher und aufrufbare Objekte?

Wie verwaltet „std::function' Speicher und aufrufbare Objekte?

Patricia Arquette
Freigeben: 2024-12-01 02:51:17
Original
821 Leute haben es durchsucht

How Does `std::function` Manage Memory and Callable Objects?

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); }
};
Nach dem Login kopieren

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();
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage