>백엔드 개발 >Golang >성능 저하 없이 C에서 Go-Style Defer를 달성하는 방법은 무엇입니까?

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

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-02 21:06:30482검색

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

Defer Implement in C

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

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

<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{} *[&amp;]()
#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>

이 0은 -오버헤드 구현은 C에서 리소스 정리를 관리하는 편리하고 효율적인 방법을 제공하여 복잡한 RAII 클래스나 사용자 정의 메모리 관리 기술이 필요 없이 Go와 유사한 연기 기능을 제공합니다.

위 내용은 성능 저하 없이 C에서 Go-Style Defer를 달성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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