2016-11-01 2 views
0

Je veux écrire une application en C++ avec les meilleures performances d'exécution. J'ai donc décidé d'intégrer toutes les méthodes.Inline toutes les méthodes dans C++, pas de fichier Cpp?

J'ai le problème mentionné here.

Il me donne une erreur de référence non définie si j'utilise le mot-clé inline dans le fichier cpp dans les deux compilateurs MSVC 2015 et MinGW. Mais si je veux aligner toutes les méthodes dans le fichier d'en-tête, il n'y aurait pas besoin de fichiers cpp. Est-ce vrai? Pourquoi donc?

+1

Inline de nos jours n'est pas sur la performance – deviantfan

+4

Ecrivez le code pour que cela fonctionne. Si elle est lente, utilisez un profileur pour déterminer ce qui est lent et réparer cette partie. Répétez au besoin. Ne décidez pas simplement que vous devez tout mettre en ligne. – crashmstr

+0

@deviantfan alors quelle est votre suggestion sur la performance? –

Répondre

3

Le mot-clé inline n'a rien à voir avec les performances de nos jours et n'a rien à voir avec l'intégration d'une fonction!

En fait, il s'agit de la règle de définition unique (ou ODR)! L'ODR stipule qu'un programme C++ doit avoir une seule définition de chaque fonction.

Cela signifie que ce qui suit est produira une erreur:

file.cpp

void fun() {} 

main.cpp

void fun() {} 

Ceci est un erreur, car il existe deux définitions de la même fonction dans deux unités de traduction différentes (fichiers .cpp), ce qui constitue une violation de l'ODR.

Maintenant, le mot-clé inline vous permet de contourner ce problème. Il vous permet de définir la même fonction dans plusieurs unités de traduction, tant que le corps de la fonction est exactement le même! Cela vous permet de définir la fonction dans un fichier d'en-tête qui peut ensuite être inclus dans plusieurs fichiers .cpp.

Cela étant dit. Ce que vous avez décrit et non provoque un ralentissement des performances. Le compilateur alignera les fonctions correctes au moment approprié. Votre code fonctionnera plus vite que vous ne pourriez le faire vous-même.

+0

C'est faux. Dans mon compilateur IAR, en mode Debug (aucune optimisation), l'insertion d'une fonction peut faire une grande différence. Sur le système embarqué sur lequel je travaille, nous n'utilisons pas le mode Release. Le code de débogage est libéré sans symboles (pour faciliter le débogage des produits retournés). J'ai montré dans les listes de langage d'assemblage que l'inline fait une différence. –

+2

@ThomasMatthews Vous libérez un produit fini en mode débogage? Je ne peux pas envelopper ma tête autour de ça. De toute façon, le point que j'essayais de faire était que vous ne devriez pas faire le travail du compilateur en indiquant quelle fonction s'introduire. Il peut le faire pour vous. – DeiDei

+1

@ThomasMatthews équivaut à mettre 'register' devant les variables afin de sauver les accès mémoire. Dans une construction non optimisée, cela pourrait faire la différence. Mais quiconque recherche des performances aura le compilateur optimiser le code, ce qui éliminera le besoin de 'inline' et' register'. Et d'ailleurs, l'inertie trop zélée pourrait nuire à la performance. Un compilateur est susceptible d'éviter cet écueil. – eran