Tout dépend de vous, si l'appelant est votre code. Si l'appelant n'est pas sous votre contrôle, vous devez soit suivre leur convention existante ou développer votre propre convention ensemble. Par exemple, sur une plate-forme x86, lorsque l'arithmétique en virgule flottante est traitée par des instructions FPU, le résultat d'une fonction est renvoyé comme valeur supérieure de la pile de registres FPU. (Si vous le savez, les registres FPU x86 sont organisés en une sorte de "pile circulaire"). A ce moment, il n'est ni float
ni double
, c'est une valeur stockée avec une précision FPU interne (qui peut être supérieure à float
ou double
) et il est de la responsabilité de l'appelant de récupérer cette valeur du haut de la pile FPU et de la convertir en tapez le désire. En fait, c'est ainsi que fonctionne une instruction FPU typique: elle prend ses arguments du haut de la pile FPU et repousse le résultat sur la pile FPU. En implémentant votre fonction de la même manière, vous émulez essentiellement une instruction FPU "complexe" avec votre fonction - une manière plutôt naturelle de le faire. Lorsque l'arithmétique à virgule flottante est traitée par les instructions SSE, vous pouvez choisir un registre SSE dans le même but (utilisez xmm0
comme vous utilisez EAX
pour les entiers).
Pour les structures complexes (c'est-à-dire plus grandes qu'un registre ou une paire de registres), l'appelant transmet normalement un pointeur à un tampon réservé à la fonction. Et la fonction mettrait le résultat dans le tampon. En d'autres termes, sous le capot, les fonctions ne "retournent" jamais vraiment de gros objets, mais les construisent plutôt dans un tampon mémoire fourni par l'appelant. Bien sûr, vous pouvez utiliser cette méthode de "mémoire tampon" pour renvoyer des valeurs de tout type, mais avec des valeurs plus petites, c'est-à-dire des valeurs de type scalaire, il est beaucoup plus efficace d'utiliser des registres qu'un emplacement de mémoire. Cela s'applique également aux petites structures.
Les énumérations sont généralement simplement un wrapper conceptuel sur un type entier. Donc, il n'y a pas de différence entre retourner un enum ou un entier.
Si vous souhaitez connaître la "méthode standard", vous devez spécifier votre plate-forme. Quel matériel, quel système d'exploitation et quel compilateur utilisez-vous? –
@StephenCanon Je n'ai pas réalisé que ceux-ci sont liés lorsque j'ai posté la question. Merci. – smwikipedia