Frage

Ich habe meine eigenen Compiler und ein großer Teil davon wurde die Konstruktion ist offensichtlich der Registerzuordner, die so effizient wie möglich temporäre Variablen mit Maschinenregister abgeglichen wird. Auf einer Architektur, wie beispielsweise die x86 gibt es nicht viele Register, so gibt es eine Anzahl von Verschüttungen ist, in den Variablen, die im Speicher gespeichert werden muss (der Stapel). Darüber hinaus gibt es im Speicher gespeicherten Variablen, weil sie zu groß sind, in einem Register zu passen.

Das Register Allocator wird tatsächlich wieder aufgerufen, um die Variablen im Speicher effizient zuzuteilen, so dass so viel Raum wie möglich geteilt. Das eigentliche Problem ist es keine Möglichkeit, die Registerzuordner auf Platz zwei Variablen im Speicher nebeneinander zu begrenzen (da ich dann größer Variablen als eine Anzahl von kleineren Variablen geben kann) und dem Allocator zu ermöglichen, die kleineren Variablen zu bewegen so dass die größeren können Variablen passen, und ich frage mich, ob es irgendwelche Algorithmen, um dies zu handhaben, sonst muss ich den Speicher in verschiedene Bereiche aufgeteilt, die jeweils Halte Variablen einer anderen Größe.

Hier ist ein Beispiel, dies zu zeigen:

void f(){
    int32_t a, b;
    //something happens to a and b...
    int64_t c;
    //something happens to c...
}

Es gibt einige Annahmen hier zum Zweck des Beispiels zu machen ..., dass die Variablen nicht optimiert ist weg, a und b sind nicht mehr sinnvoll, wenn c definiert wurde und dass alle die Variablen auf Stapel reserviert Erinnerung. Klar wurde ich ‚c‘ will die gleichen Speicher wie ‚a‘ und ‚b‘ verwenden, nur verwendet, und damit nur 8 Bytes zuweisen, aber die aktuelle Version meines Compiler würde zuweisen volle 16 Byte.

Meine Frage ist, wie kann ich Variablen im Speicher unterschiedlicher Größe effizient zuteilen?

War es hilfreich?

Lösung

Klar, dass die Registerzuordner nicht allgemein genug ist Stack-Speicher zuzuordnen, da es keinen Sinn macht, benachbarte Register-koaleszieren dest auf einem x86.

Warum erweitern Sie es nicht genau das zu tun? Oder, noch besser teilen oder Unterklasse direkt zu handhaben registrieren und Stapelzuordnungen.

Wie für den Stapel allocator, dann ist es in der Regel nicht die Ausführung zeiteffizient noch besonders platzspar den Stapel in den (seltenen) Fall verwendet zu minimieren, dass zwei Variablen die gleiche Zuordnung aufgrund nicht überlappende Umfang teilen. Die Operationen zuzuweisen und den zusätzlichen Stapelspeicher im Umfang Übergang zu ausplanen ist unwahrscheinlich, es wert zu sein. Auch in den kritischsten von Echtzeit-Verarbeitung, ist man in der Regel viel mehr daran interessiert, Robustheit und Geschwindigkeit als Abschaben ein paar Bytes des Stapelspeichers.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top