>  기사  >  백엔드 개발  >  C가 최소한의 오버헤드로 Go 스타일의 연기 기능을 달성할 수 있습니까?

C가 최소한의 오버헤드로 Go 스타일의 연기 기능을 달성할 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-01 20:07:30105검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.