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

Mary-Kate Olsen
Freigeben: 2024-11-02 21:06:30
Original
478 Leute haben es durchsucht

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 schwierig 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, stehen externe Implementierungen zur Verfügung . Eine solche Implementierung ist eine leichte Lösung ohne Overhead:

<code class="cpp">#ifndef defer
struct defer_dummy {};
template <class F> struct deferrer { F f; ~deferrer() { f(); } };
template <class F> deferrer<F> 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{} *[&amp;]()
#endif // defer</code>
Nach dem Login kopieren

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

<code class="cpp">defer { statements; };</code>
Nach dem Login kopieren

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

<code class="cpp">auto file = std::fopen(filename, "rb");
if (!file)
    return false;

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

// ...</code>
Nach dem Login kopieren

Diese Null -overhead-Implementierung bietet eine bequeme und effiziente Möglichkeit, die Ressourcenbereinigung in C zu verwalten, indem sie eine Go-ähnliche Verzögerungsfunktion bereitstellt, ohne dass komplexe RAII-Klassen oder benutzerdefinierte Speicherverwaltung erforderlich sind Techniken.

Das obige ist der detaillierte Inhalt vonWie erreicht man Go-Style-Defer in C ohne Einbußen bei der Leistung?. 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