Dalam argumen CDECL didorong ke tumpukan dalam urutan terbalik, pemanggil membersihkan tumpukan dan hasilnya dikembalikan melalui registri prosesor (nanti saya akan menyebutnya "register A"). Di STDCALL ada satu perbedaan, pemanggil tidak membersihkan tumpukan, panggilan yang melakukannya.
Anda bertanya mana yang lebih cepat. Tidak ada. Anda harus menggunakan konvensi pemanggilan asli selama Anda bisa. Ubah konvensi hanya jika tidak ada jalan keluar, saat menggunakan pustaka eksternal yang membutuhkan konvensi tertentu untuk digunakan.
Selain itu, terdapat ketentuan lain yang dapat dipilih oleh compiler sebagai default yaitu compiler Visual C ++ menggunakan FASTCALL yang secara teoritis lebih cepat karena penggunaan register prosesor yang lebih luas.
Biasanya Anda harus memberikan tanda tangan konvensi pemanggilan yang tepat untuk fungsi panggilan balik yang diteruskan ke beberapa pustaka eksternal yaitu panggilan balik ke qsort
dari pustaka C harus CDECL (jika kompiler secara default menggunakan konvensi lain maka kita harus menandai callback sebagai CDECL) atau berbagai panggilan balik WinAPI harus STDCALL (seluruh WinAPI adalah STDCALL).
Kasus lain yang biasa terjadi ketika Anda menyimpan pointer ke beberapa fungsi eksternal yaitu untuk membuat pointer ke fungsi WinAPI, definisi jenisnya harus ditandai dengan STDCALL.
Dan di bawah ini adalah contoh yang menunjukkan bagaimana kompilator melakukannya:
i = Function(x, y, z);
int Function(int a, int b, int c) { return a + b + c; }
CDECL:
push on the stack a copy of 'z', then a copy of 'y', then a 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)
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, the result is in register A)
STDCALL:
push on the stack a copy of 'z', then a copy of 'y', then a copy of 'x'
call
move contents of register A to 'i' variable
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)