[C/C++] Aufrufkonvention (Calling convention)

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von xXsoureXx, 22. Januar 2010 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 22. Januar 2010
    Aufrufkonvention (Calling convention)

    Bin "mal wieder" etwas wissbegierig

    Unzwar geht es um, wie schon im Titel erwähnt, Aufrufkonvention
    (__fastcall, __stdcall, __cdecl etc.). Ich finde im Internet (Google) x Beschreibungen,
    dazu was sie machen, allerdings fehlt es mir stark an Beispielen.

    Wenn ich eine Funktionschreibe weiß ich nicht ob es da jetzt "intelligent" ist,
    Aufrufkonvention zu benutzen?! Woran kann ich mich da z.B. orientieren?
    Oder ist es evl. doch "unnötig", Aufrufkonventionen zu benutzen?

    Beispiel - Zahlentauschen:
    Code:
    void __fastcall swap(int &a, int &b)
    {
     int temp = a;
     a = b;
     b = temp;
    }
    Ja, klar/Nein, Schwachsinn?
    ->Würd mich über ein paar Beispiele (& dazu Erklärung warum/warum nicht) freuen.

    sollte jemand dazu einen guten Link haben tut's der natürlich auch

    btw wär dazu ein Tutorial vll mal ganz cool

    so far
    xXsoureXx
     
  2. 22. Januar 2010
    AW: Aufrufkonvention (Calling convention)

    Erstmal vorweg: Jede Funktion hat eine Aufrufkonvention! In C/C++ ist das standardmäßig __cdecl.

    Aufrufkonventionen regeln die Parameterübergabe, die Registerbenutzung und die Stackbereinigung.

    Falls du kein ASM kannst, macht es auch keinen Sinn diese dir zu erklären, deshalb überspring ich das mal

    Lass es einfach auf Standard, sprich __cdecl. Wenn die Anwendung schon so Zeitkritisch ist, dass man sich über Aufrufkonventionen Gedanken macht, dann sollte man den Code eh inline'n und nicht in eine Funktion auslagern. Andere Aufrufkonventionen sind nur für die Benutzung von anderen APIs interessant. Die Windows API benutzt zum Beispiel __stdcall, aber auch das braucht dich nicht zu kümmern, weil dein Compiler dass dank den Headern eh schon weiß.
    Klassen benutzen übrigens immer (außer bei statischen Methoden) __thiscall. Dabei ignoriert der Compiler also jede deiner Angaben bezüglich der calling convention.
    Dazu kommt noch, dass es bei AMD64/Intel-64/x64-Code keine Aufrufkonventionen mehr gibt, diese also auch ignoriert werden.

    Für den normalen Programmierer sind die Aufrufkonventionen uninteressant. Höchstens für Inline-Assembler (das es bei x64 auch nicht mehr gibt) ist das noch wichtig.

    Dein Code-Beispiel ist totaler Schwachsinn! Deine Funktion macht nämlich nichts, außer seine Kopien von a und b zu vertauschen. Aber wie gesagt, effektiv kommt da nichts raus. Warum, musst du selber herausfinden

    P.S.: Jeder brauchbare Compiler wird deine Funktion wohl eh inline'n, daher spart man durch sowas selten etwas.
     
  3. 22. Januar 2010
    AW: Aufrufkonvention (Calling convention)

    Das war mir bewusst, auch wenn ich das wohl "etwas" falsch oben geschrieben habe

    so besser?

    ASM beherrsche ich nicht & hab 'en x64 Prozessor. Also lass ich dass
    dann mal lieber >D

    danke
    ->close
     
  4. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.