Maison > développement back-end > C++ > std::function vs pointeurs de fonction : quand devriez-vous choisir chacun en C ?

std::function vs pointeurs de fonction : quand devriez-vous choisir chacun en C ?

Susan Sarandon
Libérer: 2024-11-12 07:38:01
original
532 Les gens l'ont consulté

 std::function vs. Function Pointers: When Should You Choose Each in C  ?

std::function vs. Function Pointers en C : lequel choisir et quand ?

Quand il s'agit de définir des fonctions de rappel en C , vous disposez de deux options principales : les pointeurs de fonction de style C et std::function. Ce choix peut avoir un impact significatif sur les capacités et l'efficacité de votre code.

Pointeurs de fonction de style C

Les pointeurs de fonction existent depuis longtemps et sont encore largement utilisés. Ils offrent la simplicité de stocker un pointeur vers une fonction :

void (*callbackFunc)(int);
Copier après la connexion

Cependant, ils présentent une limitation importante :

Absence de capture de contexte : les pointeurs de fonction ne peuvent pas conserver le contexte (par exemple, les variables capturées) de la fonction parent. Cela signifie que vous ne pouvez pas facilement transmettre des fonctions lambda ou appeler des fonctions membres d'objets comme rappels.

std::function

std::function (introduit dans C 11) était conçu pour surmonter ces limitations. Il fournit un moyen générique et sécurisé de type pour stocker et transmettre des fonctions :

std::function< void(int) > callbackFunc;
Copier après la connexion

Avantages de std::function :

  • Contexte Capture : std::function peut capturer le contexte de la fonction parent, permettant l'utilisation de lambdas ou d'une fonction membre pointeurs.
  • Stockage : std::function peut être stocké dans les membres de données, ce qui le rend adapté à l'enregistrement de rappel et au stockage de fonctions persistantes.
  • Compatibilité universelle : Il fonctionne avec tous les objets appelables, y compris les pointeurs de fonction, les foncteurs et lambdas.

Inconvénients de std::function:

  • Call Overhead : L'invocation de std::function entraîne un léger surcharge de performances par rapport à la fonction directe appels.
  • Non-Inlined : L'appel à std::function n'est pas intégré par défaut, contrairement aux appels de fonction directs.

Paramètres du modèle

Une troisième option, particulièrement adaptée aux petites fonctions, consiste à utiliser un paramètre de modèle d'un objet appelable type :

template <typename CallbackFunction>
void myFunction(..., CallbackFunction && callback) {
    ...
    callback(...);
    ...
}
Copier après la connexion

Avantages des paramètres du modèle :

  • Inlining : l'appel à la fonction de rappel est intégré, améliorant ainsi les performances .
  • Capture de contexte : permet de capturer le contexte tel que bien.

Inconvénients des paramètres de modèle :

  • Exigence pour la mise en œuvre de l'en-tête : La fonction contenant le paramètre de modèle doit être implémenté dans l'en-tête pour prendre en charge les informations de type complètes.

Résumé Tableau

Pour résumer, le tableau suivant présente les principales différences entre ces options :

Feature Function Pointer std::function Template Parameter
Context Capture No Yes Yes
Call Overhead No Yes No
Inlining No No Yes
Class Member Storage Yes Yes No
C 11 Support Yes No Yes
Readability Less Readable More Readable Somewhat Readable

Dans la plupart des cas, à moins que vous n'ayez une exigence spécifique en matière de pointeurs de fonction ou de paramètres de modèle, std::function est le choix préféré en raison de sa flexibilité, de ses capacités de capture de contexte et de sa compatibilité universelle.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal