9
votes

Quelles sont les conventions d'appel personnalisées?

Qu'est-ce que ces sont? Et comment suis-je affecté par ceux-ci en tant que développeur?

lié:

Quelles sont les différentes conventions d'appel en C / C ++ et qu'est-ce que chaque moyenne signifie?


7 commentaires

Dans quel contexte? Win32? Win64? Linux? Solaris? Intel? PowerPC?


en double: Stackoverflow.com/questions/949862/...


Je soupçonne que des personnes qui ont voté pour la fermer (a) ne comprennent pas ce que personnalisé les conventions d'appel sont ou (b) n'a pas lu la question correctement . Ils sont une optimisation spéciale qui n'est pas couverte par la question en double. Voter pour rouvrir et supprimer les informations en double.


Je pense qu'ils sont très pertinents cependant .. Parce que je vois très rarement des compilateurs optimisant en changeant la convention appelante .. C'est parce qu'il peut briser beaucoup de choses telles que des liaisons externes. En fait, je ne crois pas que j'ai jamais vu un compilateur essaie d'appliquer une convention personnalisée, et il ne serait senti sens que les fonctions statiques statiques, qui sont généralement simplement inlinées.


@ARLZ: Que ce soit ou non une technique courante est complètement indépendante de savoir si cette question devrait être fermée ou non. Et cela n'aurait pas dû être. Les gens étaient trop pressés en supposant que la question en double couvrait ce qui était demandé.


@Earlz: Voici un compilateur qui a profité d'une convention d'appel personnalisée pour augmenter les performances: donsbot.wordpress.com/2010/02/21/...


@Laykes: Pourquoi? Si vous pensez que la question mérite un bowvote, que diriez-vous de dire à l'OP (et aux États-Unis) pourquoi?


4 Réponses :


1
votes

Chaque langue, lors de la convocation d'une fonction, une convention sur quels paramètres seront transmis dans des variables d'enregistrement VS sur la pile et comment les valeurs de retour seront retournées.

Parfois, une convention différente de celle de la norme est utilisée et qui est appelée convention d'appel personnalisée.

Ceci est le plus courant lors de l'interopération entre différentes langues. Par exemple, C et Pascal ont des conventions différentes sur la manière de passer des paramètres. Du point de vue de C, la convention téléphonique Pascal pourrait être appelée convention d'appel personnalisée.


2 commentaires

"Pascal" n'est pas une convention d'appel personnalisée - c'est une convention d'appel normale et nommée. Aussi, c'est l'histoire, n'est-ce pas? Une relique de 16 bits jours?


J'ai dit que c'est une convention d'appel personnalisée du point de vue de C, ce qui est correct. En outre, il s'agit d'un exemple approprié pour expliquer le concept et certainement pas méritant d'un bowvote.



0
votes

sauf si vous manipulez directement la pile ou l'écriture de l'assemblage en ligne faisant référence à des variables locales, cela ne vous affecte pas. Ou si votre interface avec des bibliothèques liées à différentes conventions d'appel

Qu'est-ce que c'est: la plupart des compilateurs et une telle utilisation d'une convention d'appel standard telle que CDECL où des arguments de fonction sont poussés dans un certain ordre de la pile et de tels.


1 commentaires

Ce n'est pas tout à fait raison. Il a posé des questions sur Custom Custom Conventions d'appel, qui constituent une optimisation spéciale et ne correspondent à aucune convention d'appel existante en particulier.



1
votes

Je ne pense pas que vous ayez vraiment besoin de vous soucier.

Les conventions d'appel normales sont des choses comme __stDCall et __fastcall. Ils déterminent comment votre signature d'appel est convertie en une mise en page de pile, qui (appelant ou callee) est responsable de l'épargne et de la restauration des registres, etc. Par exemple, __fastcall doit utiliser plus de registres où __stdCall utiliserait plus de pile.

Les conventions d'appel personnalisées sont optimisées spécifiquement pour une fonction particulière et la manière dont elle est utilisée. Ils ne se produisent que, IIRC, pour des fonctions locales à un module particulier. C'est ainsi que le compilateur sait tellement sur la manière dont il est utilisé et comment vous savez qu'aucun appelant externe n'a besoin de spécifier la convention.

En fonction de cela, votre compilateur les utilisera automatiquement, le cas échéant, votre code fonctionnera légèrement plus rapidement et / ou prendra un peu moins d'espace, mais vous n'avez pas vraiment besoin de vous en vous inquiéter.


0 commentaires

11
votes

A Convention d'appel décrit comment quelque chose peut appeler une autre fonction. Cela nécessite des paramètres et de l'état à transmettre à l'autre fonction, de sorte qu'il puisse exécuter et retourner correctement le contrôle. La manière dont cela est fait doit être normalisé et spécifié, de sorte que le compilateur sait comment commander des paramètres de consommation par la fonction distante qui est appelée. Il existe plusieurs conventions d'appel standard, mais les plus courantes sont fastcall , stdcall et CDECL < / fort>.

Habituellement, le terme Convention personnalisée est un peu mal informatique et fait référence à l'une des deux choses:

  • une convention appelante non standard ou une personne qui n'est pas dans une utilisation généralisée (par exemple, si vous construisez une architecture à partir de zéro).

  • une optimisation spéciale qu'un compilateur / lieur peut exécuter qui utilise une convention d'appel unique pour améliorer les performances.

    Dans ce dernier cas, cela provoque des valeurs qui seraient autrement poussées sur la pile à stocker dans des registres. Le compilateur essaiera de prendre cette décision en fonction de la manière dont les paramètres sont utilisés à l'intérieur du code. Par exemple, si le paramètre sera utilisé comme une valeur maximale pour un indice de boucle, de sorte que l'indice soit comparé contre le MAX sur chaque itération pour voir si les choses devraient continuer, ce serait une bonne affaire pour le déplacer dans un Inscrivez-vous.

    Si l'optimisation est effectuée, cela réduit généralement la taille du code et améliore les performances.

    Et comment suis-je affecté par ceux-ci en tant que développeur?

    de votre point de vue en tant que développeur, vous vous foutez probablement; Ceci est une optimisation qui se produira automatiquement.


0 commentaires