2012-05-19 2 views
1

Donc je fais un peu d'expérimentation avec le compilateur (j'en suis à ce point de ma carrière en C++) et j'ai remarqué qu'un appel à _rotl est compilé/assemblé directement; par cela, je veux dire qu'au lieu de l'ensemble effectuant un call, les opcodes (bien que seulement 2) sont apparemment coupés/collés directement où l'appel est.Routage d'appel de fonction en ligne

Quel est le raisonnement derrière cela? Je crois que le terme est "fonction inline" mais je pourrais me tromper.

+0

Le compilateur inline automatiquement certaines fonctions pour l'optimisation. – chris

+0

Oui, mais quelles sont-elles? Qu'est-ce qui constitue le compilateur en soulignant une certaine fonction? – Qix

Répondre

6

Ce n'est pas une fonction inline, c'est un intrinsic function. Conçu pour tirer parti des capacités spécifiques du processeur cible. Il s'inline inconditionnellement et sans déclarer la fonction inline, produisant typiquement une seule instruction de code machine. Dans le cas de _rotl(), en utilisant l'instruction x86 ROL.

+0

Parfait, appris un nouveau terme! C'est l'idée de l'inline, mais sur les stéroïdes (le bon type). – Qix

+2

Erm, le type non-portable. Pas toujours bon. –

+0

C'est vrai, mais pour le compilateur, ce n'est pas trop mal. De la façon dont ils l'ont décrit à votre lien, au moins. – Qix

1

Le mot-clé inline en C++ suggère au compilateur de rendre certaines fonctions (généralement courtes) en ligne, afin de réduire le temps système causé par la commande d'assemblage call (instruction du processeur).

Cependant, ce n'est qu'une suggestion, donc d'autres fonctions courtes qui ne sont pas explicitement marquées inline peuvent aussi être insérées, et elles peuvent aussi ignorer votre demande d'inline, surtout si la fonction est assez grande.

L'opération inline elle-même copie fondamentalement le corps de la fonction dans chaque endroit où elle est utilisée, sans avoir à l'appeler.

Vous pouvez toujours google à ce sujet et trouver plus d'informations.

EDIT: L'inline se produit généralement uniquement avec les optimisations activées; essayez de les allumer et de les éteindre et de comparer le démontage.

+1

Tous les compilateurs modernes utilisés aujourd'hui ignorent le conseil humain sur l'inline car il est généralement faux. À moins d'être forcés de suivre l'intrant humain, ils utilisent leur propre heuristique à la place. –

+0

Le mot-clé en ligne peut être lu par les humains, cependant, et peut parfois améliorer la lisibilité du code (je suppose). –

+0

Je dirais que cela diminue la lisibilité des attentes. Vous ne devez utiliser en ligne que lorsque cela est nécessaire (lorsque l'éditeur de liens a besoin de supprimer plusieurs copies). http://stackoverflow.com/q/1759300/14065 –

1

L'intégration est faite à des fins d'efficacité. Premièrement, il économise le coût d'un call en insérant essentiellement la fonction «en ligne». C'est-à-dire, faire une copie de cette fonction et l'insérer là où l'appel était à l'origine. Deuxièmement, le code à exécuter est plus proche, ce qui facilite la mise en cache en raison de la localisation spatiale.

Les fonctions sont généralement en ligne si elles sont appelées dans une boucle, où cette surcharge devient plus importante. Vous pouvez utiliser le mot-clé inline pour indice pour le compilateur que vous voulez une fonction inline, mais il n'y a aucune obligation pour le compilateur de le faire. Vous pouvez parfois utiliser des mots-clés spécifiques au compilateur pour forcer les lignes. Par exemple, __forceinline avec VC++.

+0

+1 pour le mot clé '__forceinline'. Y a-t-il un opposé à '__forceinline'? – Qix

+2

@ Di-0xide: '__declspec (noinline)' fera l'inverse pour les fonctions membres. –

Questions connexes