ProgrammationDéveloppeur C++ / Programmeur système

Qu'est-ce que les fonctions inline en C++, comment fonctionne le mot-clé inline ? Quelles sont les véritables limites et les risques d'un usage excessif des fonctions inline dans de grandes compilations ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Les fonctions inline sont des fonctions pour lesquelles le compilateur peut (mais n'est pas obligé) remplacer l'appel par une insertion directe du code de la fonction à l'emplacement de l'appel. Pour cela, on utilise le mot-clé inline.

  • Le mot-clé inline donne un conseil au compilateur, mais n'est pas une obligation : il peut être ignoré si la fonction est trop complexe.
  • En réalité, les fonctions définies à l'intérieur d'une classe sont considérées par défaut comme inline.
  • Les fonctions inline sont souvent utilisées pour des fonctions courtes et fréquemment appelées, afin d'éviter les frais généraux liés aux appels.

Limites et risques :

  • Une duplication fréquente de code lors d'un grand nombre d'appels et d'inclusions de la même fonction header dans différents fichiers peut augmenter considérablement la taille du binaire.
  • Les fonctions complexes ou celles qui appellent d'autres fonctions inline, le compilateur peut ne pas les développer en inline.

Exemple :

inline int add(int a, int b) { return a + b; } struct X { int get() const { return value; } int value; }; // get() sera considéré comme inline

Question piège.

Question : Le mot-clé inline garantit-il que la fonction sera intégrée à tous les points d'appel ?

Réponse : Non. Le compilateur décide de l'insertion de la fonction inline de manière autonome, en fonction des heuristiques internes. inline n'est qu'une recommandation.

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet.


Histoire

Dans un système financier, un logger utilisé fréquemment a été écrit avec des dizaines de grandes fonctions inline. Après la croissance du système, la taille du binaire a augmenté exponentiellement, entraînant un temps de liaison accru et une réduction de l'efficacité du cache sur le serveur.


Histoire

Lors de la migration d'un logiciel multiplateforme, il a été découvert que certains compilateurs (par exemple, MSVC et GCC) traitent différemment le inline : certaines fonctions n'étaient pas développées en inline, d'autres l'étaient, ce qui causait des différences de vitesse et de taille des applications à reproduire difficilement entre les plateformes.


Histoire

Un développeur a déclaré des fonctions inline uniquement dans le fichier header, mais a déplacé l'implémentation dans un fichier cpp distinct. En conséquence, lors de la liaison, des erreurs de définition multiple ou de référence externe non résolue se produisaient, car les fonctions inline doivent être définies précisément dans les en-têtes.