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{} *[&]() #endif // defer</code>
Diese Implementierung erfordert nur minimale Einrichtung und kann problemlos in Ihre Codebasis integriert werden. Die Syntax ist unkompliziert:
<code class="cpp">defer { statements; };</code>
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>
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!