3 Réponses :


2
votes

Parce que c'est une fonction "en ligne". Les fonctions en ligne peuvent être incluses des en-têtes autant de fois que vous le souhaitez et ne causent pas d'erreurs de définition de définition en double.

Le compilateur essaiera également de les apporter en ligne, dans votre exemple ci-dessus, le compilateur sera essayer et éliminer l'appel au constructeur complètement.


0 commentaires

13
votes

Les fonctions en ligne sont des exceptions à la "règle d'une définition": vous êtes autorisé à avoir des implémentations identiques d'eux dans plus d'une unité de compilation. Les fonctions sont en ligne si elles sont déclarées inline ou implémentées dans une définition de classe.


8 commentaires

Es-tu sûr de ça? Si je le compile et regarde le démontage, je vois clairement une instruction "appel". Donc, pas d'inlinage. De plus, je peux déclarer des fonctions récursives dans la définition de la classe, les inclure plusieurs fichiers .CPP et obtenir une erreur de liaison. Comment peuvent-ils être inline? (Peut-être un comportement spécifique aux États membres, cependant)


@nikie: Même s'il peut y avoir une instruction d'appel, les fonctions sont traitées différemment par la liaison, voir le lien de ma réponse pour plus de détails.


@nikie "Fonction en ligne" ne signifie pas que les appels sont inline. Cela signifie simplement qu'ils obtiennent un traitement spécial par la liaison afin que plusieurs définitions sont autorisées dans le programme. Pour que les appels soient inlinés, cela soit nécessaire - car ce n'est qu'alors, plusieurs TU peuvent voir le code et non seulement un tu. Mais ce n'est pas suffisant - le compilateur peut toujours utiliser des instructions d'appel simples.


@nikie Le compilateur n'est jamais obligé de rien aligner physiquement. -


@Tall: Mon erreur. Je pensais que "la fonction en ligne" signifiait que les appels vers la fonction devaient être inlinés. Merci pour la clarification.


Je dois dire que j'utilise le mot-clé en ligne plus fréquemment pour ses propriétés de liaison que pour les performances!


Merci beaucoup pour l'explication précise;)


@Ashleysbrain: Je l'utilise seulement pour ça!



7
votes

Les fonctions de membre avec la mise en œuvre à l'intérieur de la définition de la classe sont traitées comme des fonctions en ligne. Les fonctions en ligne sont exemptées d'une règle de définition.

Plus précisément lorsque la lieur voit deux fonctions en ligne avec la même signature, elle les traite comme si elle est la même fonction et en choisit simplement l'une d'elles. Cela peut diriger à vraiment étrange difficile à détecter les problèmes .


0 commentaires