Maison développement back-end C++ Fonctions en ligne en C et C++

Fonctions en ligne en C et C++

Sep 09, 2024 am 10:33 AM

Inline Functions in C and C++

Introduction

C++ a ajouté le mot-clé inline qui peut préfixer une définition de fonction, tel que :

inline int max_int( int a, int b ) {
    return a > b ? a : b;
}
Copier après la connexion

pour donner au compilateur un « indice » selon lequel le programme dans son ensemble pourrait bénéficier en termes de performances de la fonction étant inline.

Une fonction qui a été inline a vu son code étendu à chaque fois qu'elle a été appelée plutôt que d'exécuter le mécanisme normal d'appel de fonction de :

  • Sauvegarde des registres.
  • Pousser les valeurs des arguments sur la pile.
  • Exécution de l'instruction d'appel.
  • La fonction exécutant finalement l'instruction ret.
  • Restauration des registres.

Pour les très petites fonctions, l'inline peut générer un gain de performances. Mais comme pour presque tout le reste, il y a des compromis à faire.

Le mot-clé en ligne a été rétroporté vers C99, mais avec des exigences légèrement différentes – nous en reparlerons plus tard.

Différences avec les macros

Les fonctions en ligne sont comme (et sont destinées à remplacer de nombreuses utilisations) des macros de type fonction. Généralement, c'est une bonne chose car les fonctions en ligne sont des fonctions et ont une sémantique complète des fonctions plutôt qu'une simple substitution de texte effectuée par le préprocesseur qui ne comprend ni le C ni le C++.

Une macro naïvement équivalente à la fonction max_int() :

#define MAX_INT(A,B)  A > B ? A : B  /* bad implementation */
Copier après la connexion

a les problèmes suivants :

  • Les arguments développés, par exemple MAX(n & 0xFF, 8), peuvent entraîner une mauvaise priorité des opérateurs.
  • Les arguments ayant des effets secondaires, par exemple MAX(n++, 8), peuvent avoir plusieurs effets secondaires.
  • Il n'y a pas de vérification de type des arguments lors de la définition.
  • Les erreurs sont souvent verbeuses et difficiles à lire.

En plus, une macro :

  • Peut modifier son argument (ce qui souvent pas ce que vous voulez).

Les fonctions en ligne ne présentent aucun de ces problèmes et peuvent pourtant offrir le même avantage en termes de performances. Par conséquent, utilisez des fonctions en ligne au lieu de macros de type fonction.

Seulement un indice

Comme mentionné, spécifier inline est seulement un « indice » pour le compilateur selon lequel le programme dans son ensemble pourrait bénéficier en termes de performances de la fonction inline. Le compilateur est libre d'ignorer l'indice.

Pourquoi ? Parce qu’il y a des cas où ce n’est pas une bonne idée, voire impossible. Une fonction n'est pas intégrée ou n'est généralement pas intégrée lorsque l'un des éléments suivants est vrai :

  • La fonction est « trop grande ».
  • Vous appelez la fonction via un pointeur vers une fonction.
  • La fonction est récursive.
  • La fonction a une boucle.

Il peut y avoir d'autres raisons. Tout dépend fortement de la fonction, de ses arguments, du compilateur et des options qui lui sont proposées.

Si le compilateur ne peut pas ou choisit de ne pas intégrer une fonction, il ne pas vous avertit qu'il ne l'a pas fait (par défaut). Certains compilateurs, par exemple gcc, ont une option -Winline qui vous avertira et vous indiquera la raison pour laquelle une fonction n'a pas été intégrée.

La spécification en ligne est similaire à l'ancien code spécifiant le registre : ce ne sont que des indices.

Quand (et quand pas) mettre en ligne

Pour la plupart des fonctions, l’essentiel du coût d’exécution de la fonction réside dans le corps de la fonction, et non dans le mécanisme d’appel de fonction. Par conséquent, pour qu’une fonction soit un bon candidat pour l’inline, elle doit généralement être :

  • Assez petit pour que le coût du mécanisme d'appel de fonction domine.
  • Utilisé dans les endroits où la performance compte réellement, par exemple dans les boucles serrées.

En cas de doute, profilez votre code. L'utilisation en ligne n'est pas un mot-clé magique « rendez-moi plus rapide ». De plus, une utilisation excessive de l'inline peut entraîner une surcharge du code qui aggrave en outre les performances de votre programme pire dans l'ensemble.

Pour en savoir plus, voir La maladie en ligne.

Les fonctions qui sont souvent de bons candidats pour l'inline incluent :

  • Les « one-liners » tels que les « getters » et les « setters ».
  • Des wrappers simples autour des appels à d'autres fonctions qui fournissent des valeurs spécifiques pour les arguments ou effectuent des conversions.

Une fonction en ligne idéale à la fois augmente les performances et diminue la taille du code.

Cependant, une mise en garde pour toute fonction en ligne est que si sa définition change, elle nécessitera de recompiler tout le code qui l'utilise.

Optimisations en ligne

Si une fonction en ligne est réellement intégrée par le compilateur, alors, en plus d'élider le code du mécanisme normal d'appel de fonction, le compilateur peut également être capable de :

  • Eliminate one or more function arguments completely whose values are constants via immediate addressing.
  • Perform better optimizations spanning the code the function is inlined into that it normally couldn’t perform across function boundaries.

Inline Function Definition

In order for the compiler to be able to inline a function, it has to be able to “see” its definition (not just its declaration) in every .c or .cpp file it’s used in just like a macro. Hence, an inline function must be defined in a header file.

Normally, a function, like everything else, must have exactly one definition by adhering to the one definition rule (ODR). However, since the definition of an inline function is “seen” in multiple .c or .cpp files, the ODR is suspended for that function.

It is possible to have different definitions for inline functions having the same name, but this results in undefined behavior since the compiler has no way to check that every definition is the same.

To inline a function in C++, all you need do is prefix the function definition with inline — that’s it. The compiler and/or linker will automatically discard all but one definition from the final executable file for you.

However, to inline a function in C, you additionally must explicitly tell the compiler into what .o file to put the one definition in the event the compiler is either unable or unwilling to inline a function via extern inline.

For example, in exactly one .c file, you would declare a function like:

// util.c
extern inline int max_int( int, int );
Copier après la connexion

That tells the compiler to “put the one definition for max_int() into util.o.”

Alternatively in C, you can instead declare an inline function static also:

static inline int max_int( int a, int b ) {
    return a > b ? a : b;
}
Copier après la connexion

If you do this, then:

  • You do not have to declare a function extern inline anywhere.
  • However, if the compiler doesn’t inline a function, it will generate a definition in every .c file it’s included into again leading to code bloat.
  • If the function has any static local variables, every definition will have distinct copies (that may or may not be what you want).

Conclusion

Inline functions, if used judiciously, can yield performance gains. Generally, only very small functions are good candidates for inlining.

Starting in C++11, inline functions can alternatively be declared constexpr, but that’s a story for another time.

References

  • Linux kernel coding style, §15 The inline disease.
  • Myth and reality about inline in C99.
  • The Annotated C++ Reference Manual, Margaret A. Ellis & Bjarne Stroustrup, Addison-Wesley, 1990, ISBN 0-201-51459-1, §7.1.2 Function Specifiers, pp. 99–105.

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

<🎜>: Bubble Gum Simulator Infinity - Comment obtenir et utiliser les clés royales
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
<🎜>: Grow A Garden - Guide de mutation complet
3 Il y a quelques semaines By DDD
Nordhold: Système de fusion, expliqué
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Comment déverrouiller le grappin
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel Java
1676
14
Tutoriel PHP
1278
29
Tutoriel C#
1257
24
C # vs C: Histoire, évolution et perspectives d'avenir C # vs C: Histoire, évolution et perspectives d'avenir Apr 19, 2025 am 12:07 AM

L'histoire et l'évolution de C # et C sont uniques, et les perspectives d'avenir sont également différentes. 1.C a été inventé par Bjarnestrousstrup en 1983 pour introduire une programmation orientée objet dans le langage C. Son processus d'évolution comprend plusieurs normalisations, telles que C 11, introduisant des mots clés automobiles et des expressions de lambda, C 20 introduisant les concepts et les coroutines, et se concentrera sur les performances et la programmation au niveau du système à l'avenir. 2.C # a été publié par Microsoft en 2000. Combinant les avantages de C et Java, son évolution se concentre sur la simplicité et la productivité. Par exemple, C # 2.0 a introduit les génériques et C # 5.0 a introduit la programmation asynchrone, qui se concentrera sur la productivité et le cloud computing des développeurs à l'avenir.

C # vs C: courbes d'apprentissage et expérience du développeur C # vs C: courbes d'apprentissage et expérience du développeur Apr 18, 2025 am 12:13 AM

Il existe des différences significatives dans les courbes d'apprentissage de l'expérience C # et C et du développeur. 1) La courbe d'apprentissage de C # est relativement plate et convient au développement rapide et aux applications au niveau de l'entreprise. 2) La courbe d'apprentissage de C est raide et convient aux scénarios de contrôle haute performance et de bas niveau.

Qu'est-ce que l'analyse statique en C? Qu'est-ce que l'analyse statique en C? Apr 28, 2025 pm 09:09 PM

L'application de l'analyse statique en C comprend principalement la découverte de problèmes de gestion de la mémoire, la vérification des erreurs de logique de code et l'amélioration de la sécurité du code. 1) L'analyse statique peut identifier des problèmes tels que les fuites de mémoire, les doubles versions et les pointeurs non initialisés. 2) Il peut détecter les variables inutilisées, le code mort et les contradictions logiques. 3) Les outils d'analyse statique tels que la couverture peuvent détecter le débordement de tampon, le débordement entier et les appels API dangereux pour améliorer la sécurité du code.

C et XML: Explorer la relation et le soutien C et XML: Explorer la relation et le soutien Apr 21, 2025 am 12:02 AM

C interagit avec XML via des bibliothèques tierces (telles que TinyXML, PUGIXML, XERCES-C). 1) Utilisez la bibliothèque pour analyser les fichiers XML et les convertir en structures de données propices à C. 2) Lors de la génération de XML, convertissez la structure des données C au format XML. 3) Dans les applications pratiques, le XML est souvent utilisé pour les fichiers de configuration et l'échange de données afin d'améliorer l'efficacité du développement.

Comment utiliser la bibliothèque Chrono en C? Comment utiliser la bibliothèque Chrono en C? Apr 28, 2025 pm 10:18 PM

L'utilisation de la bibliothèque Chrono en C peut vous permettre de contrôler plus précisément les intervalles de temps et de temps. Explorons le charme de cette bibliothèque. La bibliothèque Chrono de C fait partie de la bibliothèque standard, qui fournit une façon moderne de gérer les intervalles de temps et de temps. Pour les programmeurs qui ont souffert de temps et ctime, Chrono est sans aucun doute une aubaine. Il améliore non seulement la lisibilité et la maintenabilité du code, mais offre également une précision et une flexibilité plus élevées. Commençons par les bases. La bibliothèque Chrono comprend principalement les composants clés suivants: std :: chrono :: system_clock: représente l'horloge système, utilisée pour obtenir l'heure actuelle. std :: chron

L'avenir de C: adaptations et innovations L'avenir de C: adaptations et innovations Apr 27, 2025 am 12:25 AM

L'avenir de C se concentrera sur l'informatique parallèle, la sécurité, la modularisation et l'apprentissage AI / Machine: 1) L'informatique parallèle sera améliorée par des fonctionnalités telles que les coroutines; 2) La sécurité sera améliorée par le biais de mécanismes de vérification et de gestion de la mémoire plus stricts; 3) La modulation simplifiera l'organisation et la compilation du code; 4) L'IA et l'apprentissage automatique inviteront C à s'adapter à de nouveaux besoins, tels que l'informatique numérique et le support de programmation GPU.

C: Est-ce que je meure ou est simplement en évolution? C: Est-ce que je meure ou est simplement en évolution? Apr 24, 2025 am 12:13 AM

C isnotdying; il se révolte.1) C reste réévèreurtoitSversatity et effecciation en termes

C # vs C: Gestion de la mémoire et collecte des ordures C # vs C: Gestion de la mémoire et collecte des ordures Apr 15, 2025 am 12:16 AM

C # utilise le mécanisme de collecte automatique des ordures, tandis que C utilise la gestion manuelle de la mémoire. 1. Le collecteur des ordures de C # gère automatiquement la mémoire pour réduire le risque de fuite de mémoire, mais peut entraîner une dégradation des performances. 2.C fournit un contrôle de mémoire flexible, adapté aux applications qui nécessitent une gestion des beaux, mais doivent être manipulées avec prudence pour éviter les fuites de mémoire.

See all articles