Heim > Backend-Entwicklung > C++ > Hauptteil

std::function vs. Funktionszeiger: Wann sollten Sie jeden in C auswählen?

Susan Sarandon
Freigeben: 2024-11-12 07:38:01
Original
520 Leute haben es durchsucht

 std::function vs. Function Pointers: When Should You Choose Each in C  ?

std::function vs. Funktionszeiger in C: Was soll wann ausgewählt werden?

Wenn es um die Definition von Callback-Funktionen in C geht haben Sie zwei Hauptoptionen: Funktionszeiger im C-Stil und std::function. Diese Wahl kann sich erheblich auf die Fähigkeiten und die Effizienz Ihres Codes auswirken.

Funktionszeiger im C-Stil

Funktionszeiger gibt es schon seit langer Zeit und sie werden immer noch häufig verwendet. Sie bieten die Einfachheit, einen Zeiger auf eine Funktion zu speichern:

void (*callbackFunc)(int);
Nach dem Login kopieren

Sie weisen jedoch eine erhebliche Einschränkung auf:

Keine Kontexterfassung: Funktionszeiger können dies nicht Behalten Sie den Kontext (z. B. erfasste Variablen) der übergeordneten Funktion bei. Dies bedeutet, dass Sie Lambda-Funktionen nicht einfach als Rückrufe übergeben oder Mitgliedsfunktionen von Objekten aufrufen können.

std::function

std::function (eingeführt in C 11) war entwickelt, um diese Einschränkungen zu überwinden. Es bietet eine typsichere, generische Möglichkeit zum Speichern und Übergeben von Funktionen:

std::function< void(int) > callbackFunc;
Nach dem Login kopieren

Vorteile von std::function:

  • Kontext Capture: std::function kann den Kontext der übergeordneten Funktion erfassen und so die Verwendung von Lambdas oder Mitgliedsfunktionen ermöglichen Zeiger.
  • Speicherung: std::function kann in Datenmitgliedern gespeichert werden, wodurch es für die Rückrufregistrierung und die dauerhafte Funktionsspeicherung geeignet ist.
  • Universelle Kompatibilität: Es funktioniert mit allen aufrufbaren Objekten, einschließlich Funktionszeigern, Funktoren usw Lambdas.

Nachteile von std::function:

  • Aufrufaufwand: Der Aufruf von std::function verursacht einen geringfügigen Leistungsaufwand im Vergleich zur direkten Funktion Aufrufe.
  • Nicht inline: Der Aufruf von std::function ist im Gegensatz zu direkten Funktionsaufrufen standardmäßig nicht inline.

Vorlagenparameter

Eine dritte Möglichkeit, die sich besonders für kleine Funktionen eignet, ist die Verwendung eines Template-Parameters eines aufrufbaren Objekts Typ:

template <typename CallbackFunction>
void myFunction(..., CallbackFunction && callback) {
    ...
    callback(...);
    ...
}
Nach dem Login kopieren

Vorteile von Vorlagenparametern:

  • Inlining: Der Aufruf der Rückruffunktion ist inline, was die Leistung verbessert .
  • Kontexterfassung: Ermöglicht die Erfassung von Kontext als Na ja.

Nachteile von Template-Parametern:

  • Anforderung für die Header-Implementierung: Die Funktion, die den Template-Parameter enthält, muss sein im Header implementiert, um vollständige Typinformationen zu unterstützen.

Zusammenfassung Tabelle

Zusammenfassend zeigt die folgende Tabelle die wichtigsten Unterschiede zwischen diesen Optionen:

Feature Function Pointer std::function Template Parameter
Context Capture No Yes Yes
Call Overhead No Yes No
Inlining No No Yes
Class Member Storage Yes Yes No
C 11 Support Yes No Yes
Readability Less Readable More Readable Somewhat Readable

In den meisten Fällen ist std::function aufgrund seiner Flexibilität, Kontexterfassungsfunktionen und universellen Kompatibilität die bevorzugte Wahl, es sei denn, Sie haben eine spezielle Anforderung an Funktionszeiger oder Vorlagenparameter.

Das obige ist der detaillierte Inhalt vonstd::function vs. Funktionszeiger: Wann sollten Sie jeden in C auswählen?. 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