"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo lograr el aplazamiento Go-Style en C++ sin sacrificar el rendimiento?

¿Cómo lograr el aplazamiento Go-Style en C++ sin sacrificar el rendimiento?

Publicado el 2024-11-16
Navegar:598

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

Aplazar la implementación en C

El concepto de aplazamiento estilo Go, que permite una limpieza de recursos limpia y concisa, ha ganado popularidad en C . Sin embargo, encontrar una implementación de biblioteca estándar o con buen soporte para esta característica puede ser un desafío.

A pesar de la ausencia de soporte integrado para aplazar en la Biblioteca de plantillas estándar (STL) o Boost, hay implementaciones externas disponibles . Una de esas implementaciones es una solución ligera y sin gastos generales:

#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 implementación requiere una configuración mínima y se puede integrar fácilmente en su código base. La sintaxis es sencilla:

defer { statements; };

Por ejemplo, en el siguiente fragmento de código, la operación fclose se ejecuta automáticamente cuando se sale del alcance de la función read_entire_file:

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

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

// ...

Esta implementación sin gastos generales ofrece una manera conveniente y eficiente de administrar la limpieza de recursos en C, proporcionando una función de aplazamiento similar a Go sin la necesidad de clases RAII complejas o técnicas de administración de memoria personalizadas.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3