IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
logo

FAQ C++Consultez toutes les FAQ

Nombre d'auteurs : 34, nombre de questions : 368, derni�re mise � jour : 14 novembre 2021  Ajouter une question

 

Cette FAQ a �t� r�alis�e � partir des questions fr�quemment pos�es sur les forums de http://www.developpez.com et de l'exp�rience personnelle des auteurs.

Je tiens � souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes ; les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne pr�tend pas non plus �tre compl�te. Si vous trouvez une erreur ou si vous souhaitez devenir r�dacteur, lisez ceci.

Sur ce, nous vous souhaitons une bonne lecture.

SommaireLes fonctionsLes fonctions inline (8)
pr�c�dent sommaire suivant
 

Quand le compilateur �value l'appel d'une fonction inline, le code complet de cette fonction est ins�r� dans le code de l'appelant (c'est le m�me principe que ce qui se passe avec un #define). Cela peut, parmi beaucoup d'autres choses, am�liorer les performances, �tant donn� que l'optimiseur peut int�grer directement le code appel�, voire optimiser le code appel� en fonction du code appelant.

Il y a plusieurs fa�ons d'indiquer qu'une fonction est inline, certaines impliquant le mot-cl� inline, d'autres non. Peu importe comment une fonction est d�clar�e inline, c'est une demande que le compilateur est autoris� � ignorer : il peut en �valuer certaines, toutes ou m�me aucune. (Ne soyez pas d�courag�s si cela semble d�sesp�r�ment vague. La flexibilit� de ce qui pr�c�de est un avantage important : le compilateur peut g�rer de grosses fonctions diff�remment des petites, de plus, cela permet au compilateur de g�n�rer du code facile � d�boguer si vous sp�cifiez les bonnes options de compilation.)

Mis � jour le 5 mars 2004 Cline

Supposons l'appel suivant � une fonction g() :

Code c++ : S�lectionner tout
1
2
3
4
5
6
7
8
9
void f() 
 { 
   int x = /*...*/; 
   int y = /*...*/; 
   int z = /*...*/; 
   // ...code qui utilise x, y et z... 
   g(x, y, z); 
   // ...plus de code qui utilise x, y et z... 
 }
En supposant que l'on ait une impl�mentation typique de C++, poss�dant des registres et une pile, les registres et les param�tres sont d�pos�s sur la pile juste avant l'appel de g(). Les param�tres sont ensuite retir�s de la pile lors de l'entr�e dans g(), red�pos�s lors de la sortie de g() et finalement relus dans f(). Cela fait un certain nombre de lectures et �critures inutiles, sp�cialement dans le cas ou le compilateur a la possibilit� d'utiliser les registres pour les variables x, y et z : chaque variable pourrait �tre �crite deux fois (en tant que registre et en tant que param�tre) et lue deux fois aussi (lors de son utilisation dans g() et pour restaurer les registres au retour dans f()).

Code c++ : S�lectionner tout
1
2
3
4
void g(int x, int y, int z) 
 { 
   // ...code qui utilise x, y et z... 
 }
Si le compilateur �value l'appel de g() en tant qu'inline, toutes ces lectures et �critures disparaissent. Les registres n'auront pas besoin d'�tre �crits deux fois et les param�tres n'auront pas besoin d'�tre empil�s ni d�sempil�s, �tant donn� que l'optimiseur saura qu'ils sont d�j� dans les registres.

Bien entendu, votre configuration particuli�re sera diff�rente, et il existe de nombreux cas qui sont en dehors du cas de figure pr�sent� ici, mais l'exemple ci-dessus sert � illustrer ce qui peut se passer lors de l'int�gration inline.

Mis � jour le 5 mars 2004 Cline

Cela d�pend.

Il n'y a pas de r�ponse simple. Les fonctions inline peuvent rendre le code plus rapide, mais elles peuvent aussi le rendre plus lent. Elles peuvent rendre le code plus gros ou le rendre plus petit. Elles peuvent ralentir consid�rablement le programme ou le rendre plus performant. Elles peuvent aussi n'avoir aucun impact sur la rapidit� du code.

Les fonctions inline peuvent rendre le code plus rapide Comme vu pr�c�demment, l'int�gration du code peut supprimer une poign�e d'instructions inutiles, ce qui peut rendre le code plus rapide.

Les fonctions inline peuvent rendre le code plus lent Un exc�s de fonctions inline peut rendre le code 'indigeste', ce qui peut provoquer un exc�s d'acc�s � la m�moire virtuelle sur certains syst�mes. En d'autres mots, si la taille de l'ex�cutable est trop importante, le syst�me risque de passer beaucoup de temps � faire de la pagination sur disque pour acc�der � la suite du code.

Les fonctions inline peuvent rendre le code plus gros C'est la notion de code 'indigeste', d�crite ci-dessus. Par exemple, si un programme a 100 fonctions inline qui augmenteront � chaque fois la taille de l'ex�cutable de 100 bytes et qui sont appel�es 100 fois chacune, l'augmentation de taille de l'ex�cutable sera proche de 1 MB. Est-ce que ce Mo posera probl�me ? Qui sait, mais ce Mo risque d'�tre celui qui fera faire de la pagination au syst�me et donc le ralentir.

Les fonctions inline peuvent rendre le code plus petit Les compilateurs g�n�rent souvent plus de code pour empiler / d�sempiler les param�tres que l'inclusion du code ne ferait. C'est ce qui arrive avec de tr�s petites fonctions, et cela peut m�me arriver avec de grosses fonctions quand l'optimiseur arrive � supprimer le code redondant via l'inclusion du code - l'optimiseur peut donc transformer de grosses fonctions en petites.

Les fonctions inline peuvent augmenter la pagination Le code g�n�r� peut devenir tr�s gros, ce qui risque de causer un ralentissement consid�rable.

Les fonctions inline peuvent r�duire la pagination Le nombre de pages qui doivent se trouver en m�moire au m�me moment peut se r�duire, alors que la taille de l'ex�cutable augmente. Quand f() appelle g(), le code peut tr�s bien se trouver dans deux pages diff�rentes, alors que lorsque le compilateur inclut le code de g() dans f(), le code a plus de probabilit� de se trouver dans la m�me page.

Les fonctions inline peuvent n'avoir aucune influence sur les performances Les performances ne sont pas li�es qu'au CPU. Par contre, les entr�es/sorties, les acc�s aux bases de donn�es, l'acc�s au r�seau peuvent repr�senter un s�rieux goulot d'�tranglement. � moins que votre CPU ne soit utilis� � 100�% la plupart du temps, l'utilisation des fonctions inline n'am�liorera pas les performances g�n�rales du syst�me (et m�me si le goulot d'�tranglement se situe au niveau du CPU, les fonctions inline ne seront utiles que dans le code posant probl�me, ce qui repr�sente souvent de tr�s petits morceaux de code).

Il n'y a pas de r�ponse simple : vous devez essayer et voir ce qui est le mieux. Ne vous limitez pas � des r�ponses simplistes telles que � Ne jamais utiliser les fonctions inline � ou � Toujours utiliser les fonctions inline � ou � N'utiliser les fonctions inline que si le code fait moins de . lignes de code �. Ces r�gles arbitraires sont peut-�tre faciles � �crire, mais les r�sultats sont plus que d�cevants.

Mis � jour le 5 mars 2004 Cline

En C pur, vous pouvez r�aliser des � structs (structures) encapsul�es � en mettant un void * dans un struct, o� le void * pointe sur les vraies donn�es qui sont inconnues aux utilisateurs du struct. Ainsi ces m�me utilisateurs du struct ne peuvent pas interpr�ter les donn�es point�es par void *, mais les fonctions d'acc�s peuvent elles convertir du void * vers le type de donn�es cach�. Ce qui donne une forme de l'encapsulation.

Malheureusement ceci impose de renoncer � la s�ret� de type, et impose �galement un appel de fonction pour acc�der m�me aux zones insignifiantes de la structure (si vous permettiez l'acc�s direct au champs de la structure, chacun pourrait acc�der directement � toute la structure puisqu'il conna�trait n�cessairement les donn�es point�es par void *, et il deviendrait difficile de changer la structure de donn�es sous-jacente).

Le temps d'appel de fonction est court, mais il s'ajoute � chaque appel. Les classes C++ permettent � ces appels de fonction d'�tre ins�r�s inline. Ceci vous laisse la s�ret� de l'encapsulation avec en plus la vitesse des acc�s directs. En outre, les types des param�tres de ces fonctions inline sont contr�l�s par le compilateur, ce qui est une am�lioration par rapport aux macros #define du C.

Mis � jour le 5 mars 2004 Cline

Parce que les #define sont mauvais. Mais parfois il faut les utiliser.

Contrairement aux #define, les fonctions inline �vitent des erreurs tr�s difficiles � tracer, �tant donn� que les fonctions inline �valuent toujours chaque argument une et une seule fois. En d'autres mots, l'invocation d'une fonction inline est s�mantiquement identique � l'invocation d'une fonction classique, avec la seule diff�rence de la rapidit�.

Code c++ : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Macro qui renvoie la valeur absolue de i 
#define unsafe(i)  \ 
         ( (i) >= 0 ? (i) : -(i) ) 
  
// Fonction inline qui renvoie la valeur absolue de i 
inline 
int safe(int i) 
{ 
    return i >= 0 ? i : -i; 
} 
  
int f(); 
  
void userCode(int x) 
{ 
    int ans; 
  
    ans = unsafe(x++);   // Erreur ! x est incr�ment� deux fois 
    ans = unsafe(f());   // Danger ! f() est appel� deux fois 
  
    ans = safe(x++);     // Correct ! x est incr�ment� une seule fois 
    ans = safe(f());     // Correct ! f() est appel� une seule fois 
}
Une autre diff�rence est que les types des param�tres sont v�rifi�s, et les conversions n�cessaires effectu�es.

Les macros sont � proscrire, ne les utilisez que si vous n'avez pas d'autre alternative.

Mis � jour le 5 mars 2004 Cline

Quand vous d�clarez une fonction inline, elle a exactement l'aspect d'une fonction normale :

Code c++ : S�lectionner tout
void f(int i, char c);
Mais quand vous d�finissez une fonction inline, vous ajoutez au d�but de la d�finition de la fonction le mot-cl� inline, et vous mettez la d�finition dans le fichier d'en-t�te :

Code c++ : S�lectionner tout
1
2
3
4
inline void f(int i, char c) 
{ 
    // ... 
}

Mis � jour le 5 mars 2004 Cline

Quand vous d�clarez inline une fonction membre, elle a exactement l'aspect d'une fonction membre normale :

Code c++ : S�lectionner tout
1
2
3
4
class Fred { 
    public: 
        void f(int i, char c); 
};
Mais quand vous d�finissez une fonction membre inline, vous ajoutez au d�but de la d�finition de la fonction membre le mot-cl� inline, et vous mettez la d�finition dans un fichier d'en-t�te :

Code c++ : S�lectionner tout
1
2
3
4
inline void Fred::f(int i, char c) 
{ 
    // ... 
}
Il est habituellement imp�ratif que la d�finition de la fonction (la partie entre { ... }) soit plac�e dans un fichier d'en-t�te.
Si vous mettiez inline la d�finition d'une fonction dans un fichier d'impl�mentation cpp, et si cette fonction �tait appel�e d'un autre fichier cpp, vous obtiendriez "une erreur externe" (fonction non d�finie) au moment de l'�dition de liens.

Mis � jour le 5 mars 2004 Cline

Oui : d�finissez la fonction de membre dans le corps de classe elle-m�me :

Code c++ : S�lectionner tout
1
2
3
4
5
6
7
8
class Fred 
{ 
public: 
    void f(int i, char c) 
    { 
        // ... 
    } 
};
Bien que ce soit plus facile pour la personne qui �crit la classe, c'est aussi plus dur pour le lecteur puisqu'on m�lange � ce que fait � la classe avec � comment elle le fait �. En raison de ce m�lange, on pr�f�re normalement d�finir des fonctions membres en dehors du corps de classe avec le mot-cl� inline. Comprenez que dans un monde orient� objet et r�utilisation, il y a beaucoup de gens qui utilisent la classe, mais une seule personne qui la cr�e (vous m�me). C'est pourquoi vous devriez faire les choses en faveur du plus grand nombre plut�t que pour le plus petit.

Mis � jour le 5 mars 2004 Cline

Proposer une nouvelle r�ponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plut�t sur le forum de la rubrique pour �a


R�ponse � la question

Liens sous la question
pr�c�dent sommaire suivant
 

Les sources pr�sent�es sur cette page sont libres de droits et vous pouvez les utiliser � votre convenance. Par contre, la page de pr�sentation constitue une �uvre intellectuelle prot�g�e par les droits d'auteur. Copyright � 2025 Developpez Developpez LLC. Tous droits r�serv�s Developpez LLC. Aucune reproduction, m�me partielle, ne peut �tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'� trois ans de prison et jusqu'� 300 000 � de dommages et int�r�ts.