stdcall ve cdecl
Arama kuralları iki tür - stdcall ve cdecl vardır. Onlara birkaç sorum var.
- Cdecl bir işlevi çağıran tarafından çağrıldığında, nasıl bir arayan yok eğer yığın boş tatmalı ? Çağrı sitesinde. arayan işlevi denilmesi cdecl veya stdcall olduğunu işlevi ? Nasıl çalışır ? Ne kadar arayan olursa gerektiğini biliyor mu yığın veya ücretsiz ? Yoksa bağlayıcı sorumluluğu nerede ?
- Aramalar stdcall olarak ilan edilen bir işlev bir fonksiyonu ise(hangi bir çağrı kuralı olarak cdecl) vardır, ya da tam tersi olur bu uygunsuz olur ?
- Genel olarak, daha hızlı arama - cdecl olacak diyebilir miyiz ya stdcall ?
CEVAP
Raymond Chen gives a nice overview of what __stdcall
and __cdecl
does.
(1) arayan" yığın derleyici fonksiyon çağırma kuralı bilir ve gerekli kodu oluşturur, çünkü bir işlevi çağrıldıktan sonra. temizlemek "bilir
void __stdcall StdcallFunc() {}
void __cdecl CdeclFunc()
{
// The compiler knows that StdcallFunc() uses the __stdcall
// convention at this point, so it generates the proper binary
// for stack cleanup.
StdcallFunc();
}
It is possible to mismatch the calling convention, Bu gibi:
LRESULT MyWndProc(HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam);
// ...
// Compiler usually complains but there's this cast here...
windowClass.lpfnWndProc = reinterpret_cast<WNDPROC>(&MyWndProc);
Birçok kod örnekleri, komik bile değil bu yanlış anlama. Böyle olmalı:
// CALLBACK is #define'd as __stdcall
LRESULT CALLBACK MyWndProc(HWND hwnd, UINT msg
WPARAM wParam, LPARAM lParam);
// ...
windowClass.lpfnWndProc = &MyWndProc;
Ancak, programcı derleyici hataları göz ardı etmediğini varsayarsak, derleyici kod fonksiyonları ilgili arama kuralları anlayacaktır beri düzgün yığın temizlemek için gerekli oluşturur.
(2) Her İki yönde çalışması gerekir. Aslında, bu Windows ile etkileşime API en azından kod içinde oldukça sık, __cdecl
is the default for C and C programs according to the Visual C compiler the WinAPI functions use the __stdcall
convention için olur.
(3) ikisi arasındaki gerçek performans farkı olmalı.
__ya da __stdcall Windows cdecl?...