Fonctions en ligne 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 d’habitude négligeables, devient ici une grande partie de l’opération effectuée. Or, vu la petite taille du code généré, il serait préférable que celui-ci soit placé directement à l’endroit où la fonction est appelée, c’est-à-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 l’appel de max devra être remplacée par le code de celle-ci. L’exemple 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 n’est calculée qu’une seule fois, et non deux comme l’écriture le laissait croire (et ce qui arriverait avec des macros).

Les fonctions en ligne permettent parfois d’augmenter sensiblement la vitesse du code. Il n’y a aucune raison de s’en priver, sauf dans quelques cas rares ; en particulier, on ne peut prendre de pointeurs sur elles (voir paragraphe sur les pointeurs), puisqu’elles n’existent 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 d’avoir été définie entièrement, puisque le compilateur doit connaître le code de la fonction pour le remplacer à l’endroit de l’appel.

Le mot inline est réservé en C++ (voir annexes).

Précédent Précédent Sommaire Sommaire Suivant Suivant