„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie erreicht man Go-Style Defer in C++ ohne Einbußen bei der Leistung?

Wie erreicht man Go-Style Defer in C++ ohne Einbußen bei der Leistung?

Veröffentlicht am 16.11.2024
Durchsuche:742

How to Achieve Go-Style Defer in C   Without Sacrificing Performance?

Defer-Implementierung in C

Das Konzept der Verzögerung im Go-Stil, das eine saubere und präzise Ressourcenbereinigung ermöglicht, hat in C an Popularität gewonnen . Allerdings kann es eine Herausforderung sein, eine standardmäßige oder gut unterstützte Bibliotheksimplementierung für diese Funktion zu finden.

Obwohl in der Standard Template Library (STL) oder Boost keine integrierte Unterstützung für Defer vorhanden ist, sind externe Implementierungen verfügbar . Eine solche Implementierung ist eine schlanke Lösung ohne Overhead:

#ifndef defer
struct defer_dummy {};
template  struct deferrer { F f; ~deferrer() { f(); } };
template  deferrer operator*(defer_dummy, F f) { return {f}; }
#define DEFER_(LINE) zz_defer##LINE
#define DEFER(LINE) DEFER_(LINE)
#define defer auto DEFER(__LINE__) = defer_dummy{} *[&]()
#endif // defer

Diese Implementierung erfordert nur minimale Einrichtung und kann problemlos in Ihre Codebasis integriert werden. Die Syntax ist einfach:

defer { statements; };

Im folgenden Codeausschnitt wird beispielsweise der fclose-Vorgang automatisch ausgeführt, wenn der Bereich der Funktion read_entire_file verlassen wird:

auto file = std::fopen(filename, "rb");
if (!file)
    return false;

defer { std::fclose(file); }; // don't need to write an RAII file wrapper.

// ...

Diese Zero-Overhead-Implementierung bietet eine bequeme und effiziente Möglichkeit, die Ressourcenbereinigung in C zu verwalten und stellt eine Go-ähnliche Verzögerungsfunktion bereit, ohne dass komplexe RAII-Klassen oder benutzerdefinierte Speicherverwaltungstechniken erforderlich sind.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3