inline
Il est très fréquent, dans tout langage de programmation modulaire, décrire de petites fonctions de quelques instructions seulement, qui sont en fait essentiellement des commodités décriture. Par exemple, la fonction max
qui donne le plus grand de deux entiers :
int max(int a, int b){ if (a < b) return b; else return a;}
Le problème de ces fonctions est que la séquence appel de fonction + retour de fonction, dont la durée et la longueur de code sont dhabitude négligeables, devient ici une grande partie de lopération effectuée. Or, vu la petite taille du code généré, il serait préférable que celui-ci soit placé directement à lendroit où la fonction est appelée, cest-à-dire que la séquence :
x = max (i+j, j);
soit directement transformée en :
if (i+j < j) x = j; else x = i+j;
En langage C, on utilise pour cela une macro (voir chapitre 10). En C++, on gagne beaucoup à écrire une fonction « en ligne » (inline
). Il suffit pour cela décrire :
inline int max(int a, int b){ if (a < b) return b; else return a;}
Dans ce cas, le compilateur sait que chaque occurrence de lappel de max
devra être remplacée par le code de celle-ci. Lexemple ci-dessus est donc bien transformé de la façon souhaitée, mais avec un petit plus (non négligeable cependant) : la somme i+j
nest calculée quune seule fois, et non deux comme lécriture le laissait croire (et ce qui arriverait avec des macros).
Les fonctions en ligne permettent parfois daugmenter sensiblement la vitesse du code. Il ny a aucune raison de sen priver, sauf dans quelques cas rares ; en particulier, on ne peut prendre de pointeurs sur elles (voir paragraphe sur les pointeurs), puisquelles nexistent pas réellement. En outre, certains compilateurs ne permettent pas la création de fonctions en ligne contenant une boucle (for
, while
, do...while
), ni de branchements multiples switch
. Dans ce cas, le compilateur affiche un Warning et ignore le mot inline
.
Notons enfin que si une fonction en ligne peut être déclarée, elle ne peut être appelée avant davoir été définie entièrement, puisque le compilateur doit connaître le code de la fonction pour le remplacer à lendroit de lappel.
Le mot inline
est réservé en C++ (voir annexes).
Précédent | Sommaire | Suivant |