2010-08-24 2 views

Antwort

8

Es war eine Anpassung an die pascal Aufrufkonvention für 32-Bit-Code. Pascal war die Calling-Konvention für 16-Bit-Betriebssysteme wie OS/2 und Windows 3. Warum Pascal gewählt wurde, ist ein bisschen eine Vermutung, auch wenn ich damals ein kleiner Welpe war, aber es ist etwas effizienter. Was zählte, wenn 640 KB alles war, mit dem man arbeiten musste.

meist Win32-Funktionen sind nicht wahr stdcall wie es auch vor, wie die exportierte Funktion, bevor an den Linker präsentiert verziert. Wie void Mumble (int arg) wird _Mumble @ 4. Die Zahl nach dem @ beschreibt die Aktivierungsrahmengröße. Aber die meisten Win32-Funktionen werden ohne Dekoration exportiert. Wahrscheinlich, um dem Programmierer eine gute Chance zu geben, GetProcAddress() zum Laufen zu bringen. Ich denke, die Dekoration sollte dem Linker helfen, Diskrepanzen zwischen der deklarierten API-Funktionssignatur und der tatsächlichen zu erkennen. Wenn die Anzahl der übergebenen Argumente nicht übereinstimmt, handelt es sich um einen automatischen Kaboom, da der Angerufene mehr oder weniger Argumente vom Stapel entfernt und dann übergeben wird. Schwer zu diagnostizieren. Eine Schwäche von Stdcall, die Cdecl-Konvention hat dieses Problem nicht.

Interne Berufung ist eine bunte Mischung zwischen stdcall, cdecl und Thiscall. Ich kann nicht sagen, dass ich jemals ein Muster entdeckt habe, obwohl das Ausführen von Windows-Code mit einem einzigen Schritt nicht gerade Spaß macht.

+2

der Mangel an Symbol Dekoration ist Ursache die Winapi-Binärdateien verwenden '.def' Dateien zum Exportieren (die Streifen Dekoration und/oder verwendet eine ordianl), dies macht den Import über GetProcAddress einfach, da es keine Symboldekoration – Necrolis

+0

Guter Punkt, ich denke du hast Recht. –

4

Code mit stdcall zusammengestellt ist deutlich geringer als bei cdecl kompilierten Code (die Alternative). Zu der Zeit, als die Entscheidung getroffen wurde, war kleinerer Code schneller Code.

+0

Eigentlich bevorzugte ich Hans Passants Antwort auf meine, aber was auch immer. –

+0

Da Sie ein Microsofetee (für lange Zeit) sind, wählte ich Ihre Antwort. – Benjamin

+0

Haben Sie Beweise für diesen Anspruch? Intuitiv denke ich, es sollte ein Wash zwischen stdcall und cdecl sein und googling kommt nicht auf Größenvergleiche zwischen den beiden Aufrufkonventionen. –

Verwandte Themen