2017-02-10 19 views
-4

Mein Verständnis ist die C-Aufrufkonvention platziert Argumente auf dem Stapel vor dem Aufruf einer Funktion. Auf diese Argumente kann innerhalb der Funktion durch explizite Stapelparameter unter Verwendung von EBP als Referenz wie [EBP + 8] oder [EBP + 12] zugegriffen werden.Sind lokale Variablen notwendig?

Meine Frage ist, wenn es auf diese Weise zugegriffen werden könnte, warum sind lokale Variablen notwendig? - Kann eine Funktion nicht einfach direkt mit den Argumenten arbeiten? Ist es nur für Fälle, in denen die Funktion keine Parameter hat, aber dennoch lokale Variablen für den internen Gebrauch initialisiert?

+0

Ich verstehe die Frage nicht ganz. Lokale Variablen werden normalerweise auch auf den Stack gelegt, so dass es keinen wirklichen Unterschied gibt. Oder willst du fragen: "Warum sollte man Dinge in CPU-Register laden, statt sie jedes Mal vom Stapel (oder anderen Speicherbereichen) aus aufzurufen?" – Thilo

+3

Eine Funktion kann tatsächlich ihre Parameter ändern, und zwar genau so, wie Sie es sagen. Was aber, wenn eine Funktion * zusätzliche * Daten speichern möchte, die nicht als Parameter übergeben werden? Dann benötigt es eine lokale Variable. Fragen Sie im Kontext von kompiliertem C-Code oder wenn Sie Assembly manuell schreiben? Im letzteren Fall gibt es wirklich keine "lokale Variable" - nur Platz, der auf dem Stapel oder anderswo im Speicher reserviert ist. –

Antwort

3

Oft müssen sich Funktionen mehr Daten als nur die Parameter merken. Betrachten wir zum Beispiel diese Funktion, um die Anzahl der gesetzten Bits in seinem Argument zählen:

int popcount(int k) 
{ 
    int count = 0; 

    while (k != 0) { 
     k &= k - 1; 
     count++; 
    } 

    return (count); 
} 

Neben dem Parameter, wir müssen auch daran denken, wie viele Bits sahen wir. Daher ist eine lokale Variable erforderlich.