Dans CDECL arguments sont poussés sur la pile au revers de l'ordre, l'appelant efface la pile et le résultat est renvoyé via le processeur de registre (plus tard, je vais l'appeler "s'inscrire"). Dans STDCALL il y a une différence, l'appelant doeasn pas clair de la pile, la calle faire.
Vous vous demandez lequel est le plus rapide. Personne n'. Vous devez utiliser natif convention d'appel, aussi longtemps que vous le pouvez. Convention sur les changements que si il n'y a pas moyen de sortir, lors de l'utilisation de bibliothèques externes qui requiert une certaine convention à être utilisé.
En outre, il existe d'autres conventions que le compilateur peut choisir en tant que par défaut c'est à dire au compilateur Visual C++ utilise FASTCALL, qui est théoriquement plus rapide en raison de plus de l'utilisation extensive de registres du processeur.
Habituellement, vous devez donner un bon de convention d'appel de signature pour les fonctions de callback passé pour certains de bibliothèque externe c'est à dire de rappel à l' qsort
à partir de la bibliothèque C doit être CDECL (si le compilateur par défaut utilise l'autre convention, alors nous devons marquer le rappel que CDECL) ou les diverses WinAPI rappels doivent être STDCALL (toute la WinAPI est STDCALL).
D'autres cas d'habitude peut-être quand vous êtes stocker des pointeurs vers certaines fonctions externes c'est à dire de créer un pointeur vers WinAPI fonction de son type de définition doivent être marqués avec STDCALL.
Et ci-dessous est un exemple montrant comment le compilateur de le faire:
/* 1. calling function in C++ */
i = Function(x, y, z);
/* 2. function body in C++ */
int Function(int a, int b, int c) { return a + b + c; }
CDECL:
/* 1. calling CDECL 'Function' in pseudo-assembler (similar to what the compiler outputs) */
push on the stack a copy of 'z', then copy of 'y', then copy of 'x'
call (jump to function body, after function is finished it will jump back here, the address where to jump back is in registers)
move contents of register A to 'i' variable
pop all from the stack that we have pushed (copy of x, y and z)
/* 2. CDECL 'Function' body in pseaudo-assembler */
/* Now copies push onto the stack are 'a', 'b' and 'c' variables */
copy 'a' (from stack) to register A
copy 'b' (from stack) to register B
add A and B, store result in A
copy 'c' (from stack) to register B
add A and B, store result in A
jump back to caller code (a, b and c still on the stack, result in register A)
STDCALL:
/* 1. calling STDCALL in pseudo-assembler (similar to what the compiler outputs) */
push on the stack a copy of 'z', then copy of 'y', then copy of 'x'
call
move contents of register A to 'i' variable
/* 2. STDCALL 'Function' body in pseaudo-assembler */
pop 'a' from stack to register A
pop 'b' from stack to register B
add A and B, store result in A
pop 'c' from stack to register B
add A and B, store result in A
jump back to caller code (a, b and c are no more on the stack, result in register A)