"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como obter o adiamento do estilo Go em C++ sem sacrificar o desempenho?

Como obter o adiamento do estilo Go em C++ sem sacrificar o desempenho?

Publicado em 2024-11-16
Navegar:305

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

Defer Implementation em C

O conceito de adiamento no estilo Go, que permite uma limpeza de recursos limpa e concisa, ganhou popularidade em C . No entanto, encontrar uma implementação de biblioteca padrão ou com bom suporte para esse recurso pode ser um desafio.

Apesar da ausência de suporte integrado para defer na Standard Template Library (STL) ou Boost, existem implementações externas disponíveis . Uma dessas implementações é uma solução leve e sem sobrecarga:

#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

Esta implementação requer configuração mínima e pode ser facilmente integrada à sua base de código. A sintaxe é direta:

defer { statements; };

Por exemplo, no trecho de código a seguir, a operação fclose é executada automaticamente quando o escopo da função read_entire_file é encerrado:

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

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

// ...

Esta implementação de sobrecarga zero oferece uma maneira conveniente e eficiente de gerenciar a limpeza de recursos em C , fornecendo um recurso de adiamento semelhante ao Go sem a necessidade de classes RAII complexas ou técnicas de gerenciamento de memória personalizadas.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3