La fonction inline est l'une des fonctionnalités importantes de C++. Lorsqu'un programme exécute un appel de fonction, le processeur stocke l'adresse de retour, copie les arguments sur la pile, puis transfère le contrôle à la fonction. Ce mécanisme génère une surcharge qui peut devenir significative pour de très petites fonctions appelées fréquemment.
Une fonction inline est une fonction dont le code est inséré directement à chaque point d'appel par le compilateur, au lieu d'être exécuté via un saut. Cela élimine la surcharge liée à l'appel classique.
Syntaxe
inline type_retour nomFonction(liste des paramètres) {
// corps de la fonction
}inline est une requête adressée au compilateur, pas une commande. Le compilateur peut ignorer cette demande dans plusieurs situations : fonction contenant une boucle, des variables statiques, une récursion, une instruction switch ou goto, ou un type de retour non-void sans instruction return.
Avantages et inconvénients
| ✅ Avantages | ❌ Inconvénients |
|---|---|
| Supprime la surcharge d'appel de fonction | Augmente la taille de l'exécutable (duplication du code) |
| Évite les opérations de pile (push/pop des arguments) | Consomme davantage de registres CPU |
| Permet des optimisations contextuelles au compilateur | Peut réduire le taux de réponse du cache instruction |
| Utile pour les systèmes embarqués (petites fonctions) | Toute modification force la recompilation de tous les sites d'appel |
Fonction inline et classes
Toutes les fonctions définies dans le corps d'une classe sont implicitement inline. Pour déclarer explicitement une fonction inline définie en dehors de la classe, on utilise le mot-clé inline à la fois dans la déclaration et dans la définition.
Exemple n°1
#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;
}Votre vitesse est 264
Les fonctions virtuelles ne peuvent pas être inlinées : un appel virtuel est résolu au moment de l'exécution (runtime), alors que l'inlining est effectué à la compilation. Ces deux mécanismes sont incompatibles.
Discussion (0)
Soyez le premier à laisser un commentaire !
Laisser un commentaire
Votre commentaire sera visible après modération.