Question

J'ai vu le fastcall la notation ajouté avant de nombreuses fonctions.Pourquoi est-il utilisé?

Était-ce utile?

La solution

Que la notation avant que la fonction est appelée la "convention d'appel." Il indique comment (à bas niveau), le compilateur va transmettre les paramètres d'entrée de la fonction et de récupérer ses résultats une fois qu'il est exécuté.

Il ya beaucoup de différentes conventions d'appel, le plus populaire de la stdcall et cdecl.

Vous pourriez penser, il n'y a qu'une seule façon de faire, mais en réalité, il y a des dizaines de façons que vous pourriez appeler une fonction et de passer des variables dans et hors.Vous pouvez placer les paramètres d'entrée sur une pile (pousser, pousser, pousser à l'appel;pop, pop, pop pour lire les paramètres d'entrée).Ou peut-être vous préférez les coller dans les registres (ce qui est fastcall - il essaie de mettre certaines de l'entrée params dans les registres de la vitesse).

Mais alors que penser de la commande?Forcez-vous de gauche à droite ou de droite à gauche?Que dire de la suite - il y a toujours un seul (en supposant qu'aucun des paramètres de référence), alors pensez-vous placer le résultat sur la pile, dans un registre, à une certaine adresse de mémoire?

Aussi, nous allons supposer que vous êtes à l'aide de la pile de communication - dont le travail est-il pour vider la pile après l'appel de la fonction - l'appelant ou de l'appelé?

Ce propos de la sauvegarde et de la restauration du contenu de (certains) les registres CPU - si l'appelant le faire, ou le destinataire de l'appel de garantie que ça va revenir tout de la façon dont il a été?

Le plus populaire de la convention d'appel (et de loin) est cdecl, qui est la convention d'appel standard en C et C++.L'API WIN32 utilise stdcall, ce qui signifie n'importe quel code qui appelle l'API WIN32 besoin d'utiliser stdcall pour ces appels de fonction (pour en faire un autre choix populaire).

fastcall c'est un peu un excentrique - les gens ont réalisé de nombreuses fonctions avec un seul in/out paramètre, en poussant et en sautant à partir d'une fonction de mémoire de la pile est tout à fait un peu de surcharge et effectue des appels de fonction un peu lourd de sorte que les différents compilateurs introduit (différent) les conventions d'appel, qui aura lieu un ou plusieurs paramètres dans les registres avant de placer le reste dans la pile pour de meilleures performances.Le problème, c'est pas tous les compilateurs utilisés les mêmes règles pour ce qui va où et qui fait quoi avec fastcall, et comme un résultat, vous devez être prudent lors de l'utilisation de ce parce que vous ne saurez jamais qui fait quoi.Enfin, voir Est fastcall vraiment plus rapide? pour plus d'informations sur fastcall avantages de performance.

Des choses compliquées.

Quelque chose d'important à garder à l'esprit:ne pas ajouter ou modifier des conventions d'appel si vous ne savez pas exactement ce que vous faites, parce que si l'appelant et le destinataire de l'appel ne sont pas d'accord sur la convention d'appel, vous allez probablement finir avec la corruption de la pile et une erreur de segmentation.Cela se produit généralement lorsque vous avez la fonction appelée dans une DLL ou une bibliothèque partagée et un programme est écrit que dépend la DLL/SO/dylib étant d'une certaine convention d'appel (par exemple, cdecl), puis la bibliothèque est recompilé avec une autre convention d'appel (par exemple, fastcall).Maintenant l'ancien programme ne peut plus communiquer avec la nouvelle bibliothèque.

Autres conseils

Wikipédia déclare que

Les Conventions de droit fastcall n'ont pas été normalisées, et ont été mis en œuvre différemment selon le fournisseur de compilateur.Généralement fastcall conventions d'appel passer un ou plusieurs arguments dans les registres qui réduit le nombre d'accès à la mémoire requis pour l'appel.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top