inline est une suggestion pour le compilateur de remplacer l'appel de la fonction par son corps (insertion de code). Cela peut accélérer l'exécution (pas de surcoût d'appel), mais entraîne une augmentation de la taille du binaire.
Syntaxe :
inline int square(int x) { return x * x; }
Le compilateur peut ignorer l'inline. Pour une visibilité et une implémentation simultanées de la fonction dans différents fichiers, on utilise :
// header.h inline int min(int a, int b) { return a < b ? a : b; }
Tout le corps de la fonction doit être accessible dans chaque fichier où la fonction inline est appelée, c'est-à-dire que la manière ordinaire est de définir la fonction dans le fichier d'en-tête.
Si une fonction inline est déclarée et définie uniquement dans un fichier .c, d'autres modules ne pourront pas l'utiliser, des erreurs de liaison se produiront (référence indéfinie).
Quelle est la différence entre ces déclarations dans le fichier d'en-tête ?
inline int foo(int x) { return x + 1; } static inline int bar(int x) { return x + 1; }
inline int foo(...) permet à la fonction d'avoir de nombreuses définitions faibles (règle d'une seule définition). Si le même fichier d'en-tête est inclus dans plusieurs fichiers .c, le lisseur peut donner une erreur de définition multiple.static inline rend la fonction interne à chaque module : chaque point de connexion obtient sa propre copie, il n'y aura pas de problèmes lors de la liaison. C'est le plus sûr pour les fonctions inline dans les en-têtes.Histoire
Dans la bibliothèque des fonctions mathématiques, un grand nombre d'aides inline étaient définies dans un fichier .c. Lorsque l'on essayait de les utiliser à partir d'autres modules, des erreurs de liaison survenaient, car les définitions n'étaient visibles que dans un seul fichier objet.
Histoire
Après avoir déplacé les fonctions inline du fichier .c au projet d'en-tête, le projet tombait en panne lors de la liaison : le lisseur se plaignait de définitions multiples de la même fonction. Cela a été corrigé en remplaçant par static inline dans les fichiers d'en-tête.
Histoire
Lors de l'optimisation d'un algorithme interne, on a utilisé inline pour des fonctions "critiques", en espérant un gain de vitesse. Mais le compilateur a ignoré la suggestion, et l'analyseur a montré que les coûts d'appel n'avaient pas diminué. Le problème n'a été résolu qu'après une analyse manuelle des options d'optimisation du compilateur.