2010-06-09 4 views

Antwort

3

Here ist ein Artikel, der erklärt, wann man fastcall benutzt. Es gibt tatsächlich einen Fall, wenn Sie tatsächlich keine andere Wahl haben, aber es zu verwenden:

Einige VCL-Klassen, wie TList, erlauben Sie eine Callback-Funktion (eine Sortierroutine im Fall von TList) angeben. In diesem Fall müssen Sie auch das Schlüsselwort __fastcall verwenden, da es die VCL erwartet.

+0

Vielen Dank. Als Randnotiz: aus Ihrem Artikel, unter "Ist __fastcall eigentlich schnell?" section: "Die Quintessenz meiner Tests war, dass die Register-Aufrufkonvention nicht schneller war als die C-Aufrufkonvention und in den meisten Fällen langsamer war. Zugegeben, die Zeitunterschiede sind winzig, aber ich habe mir selbst bewiesen, dass es so wäre für die Befürworter von __fastcall schwierig sein zu behaupten, dass die Register Calling Convention ist schneller als jede andere " ..." Um zu wiederholen, was ich bereits gesagt habe, rate ich, dass Sie __fastcall nie verwenden, es sei denn, es ist erforderlich ":) – rkellerm

5

__fastcall versucht, die Funktionsargumente in den CPU-Registern zu übergeben, wenn möglich, was schneller ist.

Hier ist ein Link zu einem MSDN-Artikel erklärt, die Aufrufkonvention __fastcall: http://msdn.microsoft.com/en-us/library/6xa169sk(VS.71).aspx

Die ersten beiden DWORD oder kleinere Argumente in ECX und EDX Register übergeben werden; Alle anderen Argumente sind von rechts nach links übergeben.

Dies bedeutet, dass dies nur für die ersten beiden Argumente funktioniert und nur wenn sie < = 32 Bits sind.
Generell würde ich sagen, erwarten Sie keine großen Leistungsvorteile davon.

+1

Danke für der Link. –

1

Ich habe einen Fall, wo ich es effektiv verwende - es ist eine sehr kleine asm Routine (3 Anweisungen), die einen einzelnen Wert in einem Register manipuliert.

Für alles außer den sehr kleinsten und leistungsfähigsten Routinen sollte die Aufrufkonvention wirklich keinen Unterschied machen.

Verwandte Themen