C での遅延実装
クリーンで簡潔なリソースのクリーンアップを可能にする Go スタイルの遅延の概念は、C で人気を集めています。 。ただし、この機能の標準または十分にサポートされているライブラリ実装を見つけるのは難しい場合があります。
標準テンプレート ライブラリ (STL) または Boost には遅延の組み込みサポートがないにもかかわらず、利用可能な外部実装があります。 。そのような実装の 1 つは、軽量でオーバーヘッドのないソリューションです。
<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>
この実装には最小限のセットアップが必要で、コードベースに簡単に統合できます。構文は簡単です:
<code class="cpp">defer { statements; };</code>
たとえば、次のコード スニペットでは、read_entire_file 関数のスコープが終了すると fclose 操作が自動的に実行されます:
<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>
This zero -overhead 実装は、C でリソースのクリーンアップを管理する便利かつ効率的な方法を提供し、複雑な RAII クラスやカスタム メモリ管理手法を必要とせずに Go のような遅延機能を提供します。
以上がパフォーマンスを犠牲にすることなく C で Go スタイルの遅延を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。