C は最小限のオーバーヘッドで Go スタイルの遅延機能を実現できますか?

Patricia Arquette
リリース: 2024-11-01 20:07:30
オリジナル
114 人が閲覧しました

Can C   achieve Go-style Defer Functionality with Minimal Overhead?

C での標準的な遅延/ターミネータの実装

Go 言語の遅延関数は、関数の終了時にコードのブロックを実行する方法です。リソースのクリーンアップとエラー処理を簡素化するメカニズム。この記事では、C での同様の遅延実装の可能性と、既存のライブラリでの代替案の実現可能性を検討します。

既存の実装

C 標準ライブラリ、Boost およびその他のサードパーティ ライブラリは、既製の遅延実装をまだ提供していません。ただし、次の軽量カスタム実装は、Go 言語と同様の機能を提供します。

<code class="cpp">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{} *[&]()</code>
ログイン後にコピー

使用法

この実装は、Go 言語の遅延と同じ方法で使用されます。構文は似ています:

<code class="cpp">defer {
    // 要在函数退出时执行的代码块
};</code>
ログイン後にコピー

使用例

<code class="cpp">#include <cstdio>
#include <cstdlib>

bool read_entire_file(char *filename, std::uint8_t *&data_out,
                      std::size_t *size_out = nullptr) {
    auto file = std::fopen(filename, "rb");
    if (!file)
        return false;

    defer { std::fclose(file); }; // 自动关闭文件

    // ...其他文件操作代码

    return true;
}

int main(int argc, char **argv) {
    if (argc < 2)
        return -1;

    std::uint8_t *file_data = nullptr;
    std::size_t file_size = 0;

    auto read_success = read_entire_file(argv[1], file_data, &file_size);

    defer { delete[] file_data; }; // 自动释放文件数据

    if (read_success) {
        // ...文件处理代码

        return 0;
    } else {
        return -1;
    }
}</code>
ログイン後にコピー

利点

  • なしオーバーヘッド: この実装では、他のオブジェクトまたはスマート ポインター ベースの実装とは異なり、追加のオーバーヘッドが発生しません。
  • 簡単な構文: 構文は Go 言語の遅延構文を模倣しており、コードがより明確で読みやすくなっています。
  • 依存関係なし: 実装は完全に自己完結型であり、コンパイル時間は増加しません。

以上がC は最小限のオーバーヘッドで Go スタイルの遅延機能を実現できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!