Maison >développement back-end >Golang >Comment obtenir un Go-Style Defer en C sans sacrifier les performances ?

Comment obtenir un Go-Style Defer en C sans sacrifier les performances ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-02 21:06:30479parcourir

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

Implémentation différée en C

Le concept de report de style Go, qui permet un nettoyage propre et concis des ressources, a gagné en popularité en C . Cependant, trouver une implémentation de bibliothèque standard ou bien prise en charge pour cette fonctionnalité peut s'avérer difficile.

Malgré l'absence de prise en charge intégrée du report dans la bibliothèque de modèles standard (STL) ou Boost, des implémentations externes sont disponibles. . L'une de ces implémentations est une solution légère et sans surcharge :

<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>

Cette implémentation nécessite une configuration minimale et peut être facilement intégrée à votre base de code. La syntaxe est simple :

<code class="cpp">defer { statements; };</code>

Par exemple, dans l'extrait de code suivant, l'opération fclose est automatiquement exécutée lorsque la portée de la fonction read_entire_file est quittée :

<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>

Ce zéro -l'implémentation en surcharge offre un moyen pratique et efficace de gérer le nettoyage des ressources en C, en fournissant une fonctionnalité de report de type Go sans avoir besoin de classes RAII complexes ou de techniques de gestion de mémoire personnalisées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn