Fonctions en ligne en C++
-
Pourquoi les fonctions
inline
sont utilisées en C++ -
Implémenter des fonctions
inline
en C++ -
Implémentation de
constructor
etdestructor
en tant que fonctionsinline
en C++ -
Avantages et inconvénients de l’implémentation de fonctions
inline
en C++
Cet article traitera des fonctions inline
en C++, de la manière de les implémenter, ainsi que des avantages et des inconvénients de leur utilisation.
Pourquoi les fonctions inline
sont utilisées en C++
Chaque fois que nous exécutons un programme, le CPU stocke l’adresse mémoire de l’instruction après l’appel de la fonction ; il copie les arguments sur la pile et transfère le contrôle à la fonction spécifiée.
Ensuite, la CPU exécute le code, renvoie la valeur à un emplacement de mémoire spécifique et revient à nouveau à la fonction appelée. Cela peut créer une surcharge supplémentaire si la plupart du temps est consacré à la commutation plutôt qu’à l’exécution de la fonction.
Cette surcharge est insignifiante dans les fonctions volumineuses qui exécutent des tâches complexes gourmandes en CPU puisque la plupart du temps est consacré uniquement à l’exécution.
Cependant, cette surcharge devient importante lorsque nous avons de nombreuses petites fonctions qui n’exécutent que des tâches de base ; la plupart du temps est consacré à la commutation et peu ou pas de temps est consacré à l’exécution.
Ainsi, le concept en ligne
peut être pratique lorsque l’on dispose de nombreuses petites fonctions pour gagner du temps de commutation et gagner en efficacité.
Chaque fois qu’une fonction est déclarée comme inline
dans le code au moment de la compilation, au lieu d’attribuer une adresse à l’appel de la fonction, elle copie tout le code de la fonction et le place à cet endroit.
Syntaxe:
inline return_type function_name(arguments)
{
...
}
Une fonction inline
n’est qu’une requête au compilateur, et donc le compilateur peut l’ignorer si :
- la fonction a des variables statiques ;
- la fonction a des instructions
goto
ouswitch
; - la fonction est récursive ;
- la fonction a des boucles.
La notion de inline
est généralement utilisée avec les classes.
Implémenter des fonctions inline
en C++
Exemple de code :
#include <iostream>
using namespace std;
class myClass {
int a, b;
public:
void sum();
};
inline void myClass ::sum() {
cout << "Enter first value:";
cin >> a;
cout << "Enter second value:";
cin >> b;
cout << "Sum of two numbers is " << a + b << endl;
}
int main() {
cout << "Program using inline function\n";
myClass obj;
obj.sum();
}
Dans le code ci-dessus, nous avons déclaré la fonction comme inline
lors de sa définition car c’est une bonne pratique de programmation d’écrire la définition de la fonction inline
en dehors de la classe plutôt qu’à l’intérieur de celle-ci.
Cependant, une définition de fonction dans une classe est une définition de fonction inline
par défaut, même sans utiliser le mot-clé inline
.
Production:
Program using inline function
Enter first value:12
Enter second value:13
Sum of two numbers is 25
Implémentation de constructor
et destructor
en tant que fonctions inline
en C++
En utilisant l’exemple ci-dessus et en créant des fonctions inline
en dehors de la classe tout en la définissant, nous pouvons même rendre constructor
et destructor
comme inline
.
Exemple de code :
#include <iostream>
using namespace std;
class myClass {
int a, b;
public:
myClass();
~myClass();
void sum();
};
inline myClass::myClass() {
a = 100;
b = 200;
}
inline myClass::~myClass() { cout << "destroying the object\n"; }
inline void myClass ::sum() {
cout << "Sum of two numbers is " << a + b << endl;
}
int main() {
cout << "Program using inline function\n";
myClass obj;
obj.sum();
}
Production:
Program using inline function
Sum of two numbers is 300
destroying the object
Avantages et inconvénients de l’implémentation de fonctions inline
en C++
Voyons maintenant quelques-uns des avantages de l’implémentation de fonctions inline
:
- La surcharge de l’appel de fonction est réduite.
- Il permet d’économiser la surcharge d’un appel de retour d’une fonction.
- Économise les frais généraux de pousser et de faire éclater des variables sur la pile.
Bien qu’utile, il présente également quelques inconvénients :
- La taille du fichier exécutable binaire peut devenir importante si nous utilisons trop de fonctions
inline
car la duplication du même code se produira ici. - Trop de fonctions en ligne peuvent réduire le taux de succès du cache pour les instructions, ce qui affecte la vitesse de récupération des instructions de la mémoire cache vers la mémoire primaire.
- Dans les systèmes embarqués où la taille du code est plus importante que la vitesse, les fonctions
en ligne
ne seront pas utiles. - Un battement pourrait se produire, ce qui dégraderait les performances de la mémoire de l’ordinateur.