SORU
4 AĞUSTOS 2010, ÇARŞAMBA


stdcall ve cdecl

Arama kuralları iki tür - stdcall ve cdecl vardır. Onlara birkaç sorum var.

  1. 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 ?
  2. 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 ?
  3. Genel olarak, daha hızlı arama - cdecl olacak diyebilir miyiz ya stdcall ?

CEVAP
4 AĞUSTOS 2010, ÇARŞAMBA


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ı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Darren Kitchen

    Darren Kitch

    3 EKİM 2011
  • Pituvision

    Pituvision

    11 Mart 2006
  • Roger Huffman

    Roger Huffma

    4 ŞUBAT 2007

İLGİLİ SORU / CEVAPLAR