「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > パフォーマンスを犠牲にすることなく C++ で Go スタイルの遅延を実現するにはどうすればよいですか?

パフォーマンスを犠牲にすることなく C++ で Go スタイルの遅延を実現するにはどうすればよいですか?

2024 年 11 月 16 日に公開
ブラウズ:502

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

C での遅延実装

クリーンで簡潔なリソースのクリーンアップを可能にする Go スタイルの遅延の概念は、C で人気を集めています。 。ただし、この機能の標準または十分にサポートされているライブラリ実装を見つけるのは難しい場合があります。

標準テンプレート ライブラリ (STL) または Boost には遅延の組み込みサポートがないにもかかわらず、利用可能な外部実装があります。 。そのような実装の 1 つは、軽量でオーバーヘッドのないソリューションです:

#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

この実装には最小限のセットアップが必要で、コードベースに簡単に統合できます。構文は単純です。

defer { statements; };

たとえば、次のコード スニペットでは、read_entire_file 関数のスコープが終了すると fclose 操作が自動的に実行されます。

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

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

// ...

このオーバーヘッドゼロの実装は、C でリソースのクリーンアップを管理する便利で効率的な方法を提供し、複雑な RAII クラスやカスタム メモリ管理手法を必要とせずに Go のような遅延機能を提供します。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3