Fonctions en ligne en C++ - inline
La fonction inline est l’une des fonctionnalités importantes de C ++. Alors, commençons par comprendre pourquoi les fonctions inline sont utilisées et quel est le but de la fonction inline ?
Lorsque le programme exécute l'instruction d'appel de fonction, la CPU stocke l'adresse de mémoire de l'instruction après l'appel de fonction, copie les arguments de la fonction sur la pile et transfère enfin le contrôle à la fonction spécifiée. La CPU exécute ensuite le code de fonction, stocke la valeur de retour de la fonction dans un emplacement mémoire/registre prédéfini et renvoie le contrôle à la fonction appelante.
Cela peut entraîner une surcharge si le temps d'exécution d'une fonction est inférieur au temps de commutation de la fonction appelant à la fonction appelée. Pour les fonctions volumineuses et / ou effectuant des tâches complexes, la surcharge de l'appel est généralement insignifiante par rapport au temps nécessaire à l'exécution de la fonction.
Toutefois, pour les petites fonctions couramment utilisées, le temps nécessaire pour effectuer l’appel de fonction est souvent beaucoup plus long que le temps nécessaire pour exécuter le code de la fonction. Cette surcharge survient pour les petites fonctions car le temps d'exécution d'une petite fonction est inférieur au temps de commutation.
Solution
C ++ fournit des fonctions en ligne - inline - pour réduire la surcharge d’appel de fonction. Une fonction en ligne est une fonction qui est étendue en ligne lorsqu'elle est appelée. Lorsque la fonction inline est appelée, le code complet de la fonction inline est inséré ou substitué au moment de l'appel de la fonction inline. Cette substitution est effectuée par le compilateur C ++ au moment de la compilation. La fonction en ligne peut augmenter l'efficacité si elle est petite.
Syntaxe :
inline type_retour nomFonction(liste des paramètres){ // corps de la fonction }
Rappelez-vous que l'inline n'est qu'une requête adressée au compilateur, pas une commande. Le compilateur peut ignorer la demande d'inline. Le compilateur peut ne pas effectuer la mise en ligne dans des circonstances telles que:
- Si une fonction contient une boucle.
- Si une fonction contient des variables statiques.
- Si une fonction est récursive.
- Si un type de retour de fonction est autre que void et que l’instruction de retour n’existe pas dans le corps de la fonction.
- Si une fonction contient une instruction switch ou goto.
Avantages
- La surcharge de l'appel de fonction ne se produit pas.
- Elle sauve également la surcharge de empiler/depiler sur la pile lorsque la fonction est appelée.
- Elle permet aussi d'économiser la surcharge d'un appel de fonction.
- Lorsque vous utilisez une fonction inline, vous pouvez permettre au compilateur d'effectuer une optimisation spécifique au contexte sur le corps de la fonction. De telles optimisations ne sont pas possibles pour les appels de fonction normaux. D'autres optimisations peuvent être obtenues en considérant les flux du contexte appelant et du contexte appelé.
- La fonction Inline peut être utile (si elle est petite) pour les systèmes embarqués parce que la fonction inline peut donner moins de code que le préambule de l'appel de fonction et le retour.
Inconvénients
- Les variables ajoutées à partir de la fonction inline consomment des registres supplémentaires. Après la substitution de la fonction inline, si le nombre de variables qui vont utiliser le registre augmente, elles peuvent entraîner une surcharge pour l'utilisation des ressources de registre.
- Si vous utilisez trop de fonctions inline , la taille du fichier exécutable binaire sera grande, en raison de la duplication du même code.
- Trop de substitution peut également réduire le taux de réponse du cache, réduisant ainsi la vitesse de récupération des instructions de celle de la mémoire cache à celle de la mémoire principale.
- La fonction inline peut augmenter le temps de compilation si quelqu'un modifie le code à l'intérieur de la fonction inline, alors tout l'emplacement de l'appel doit être recompilé, car le compilateur aurait besoin de remplacer tout le code une fois de plus pour refléter les modifications, sinon il reprendra les anciennes fonctionnalités.
- Les fonctions en ligne peuvent ne pas être utiles pour de nombreux systèmes embarqués. Parce que dans les systèmes embarqués, la taille du code est plus importante que la vitesse.
- Les fonctions en ligne peuvent provoquer des contractions, car elles peuvent augmenter la taille du fichier exécutable binaire. Les contractions en mémoire réduisent les performances de l'ordinateur.
Fonction inline et classes
Il est également possible de définir la fonction inline dans la classe. En fait, toutes les fonctions définies dans la classe sont implicitement inline. Ainsi, toutes les restrictions des fonctions inline sont également appliquées ici. Si vous avez besoin de déclarer explicitement une fonction inline dans la classe, déclarez-la simplement dans la classe et définissez-la en dehors de la classe à l'aide du mot clé inline.
Exemple :
#include <iostream> using namespace std; class Voiture { private: int Id; double Vitesse; public: Voiture(); inline void rouler(double); }; inline void Voiture::rouler(double v) { Vitesse += v; cout << "Votre vitesse est " << Vitesse << endl; } Voiture::Voiture() { Id = 1; Vitesse = 240; } int main() { Voiture v1; v1.rouler(24); return 0; }
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant
Une autre chose à garder à l'esprit est qu'il est utile de rendre la fonction inline uniquement si le temps passé lors d'un appel de fonction est plus comparé au temps d'exécution du corps.