"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 성능 저하 없이 C++에서 Go-Style Defer를 달성하는 방법은 무엇입니까?

성능 저하 없이 C++에서 Go-Style Defer를 달성하는 방법은 무엇입니까?

2024년 11월 16일에 게시됨
검색:170

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

C에서 구현 연기

깨끗하고 간결한 리소스 정리를 허용하는 Go 스타일 연기 개념이 C에서 인기를 얻었습니다. . 그러나 이 기능에 대해 표준 또는 잘 지원되는 라이브러리 구현을 찾는 것은 어려울 수 있습니다.

표준 템플릿 라이브러리(STL) 또는 Boost에 지연에 대한 기본 지원이 없음에도 불구하고 사용 가능한 외부 구현이 있습니다. . 이러한 구현 중 하나는 가볍고 오버헤드가 없는 솔루션입니다.

#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