Kann ein C-Compiler Stack-Variablen neu anordnen?
Ich habe in der Vergangenheit an Projekten für eingebettete Systeme gearbeitet, bei denen wir die Reihenfolge der Deklaration von Stapelvariablen geändert haben, um die Größe der resultierenden ausführbaren Datei zu verringern. Wenn wir zum Beispiel hätten:
void func()
{
char c;
int i;
short s;
...
}
Wir würden dies folgendermaßen neu anordnen:
void func()
{
int i;
short s;
char c;
...
}
Aufgrund von Ausrichtungsproblemen wurden bei der ersten 12 Byte Stapelspeicher und bei der zweiten nur 8 Byte belegt.
Handelt es sich bei diesem Standardverhalten für C-Compiler um einen Mangel des von uns verwendeten Compilers?
Es scheint mir, dass ein Compiler in der Lage sein sollte, Stapelvariablen neu anzuordnen, um eine kleinere ausführbare Größe zu bevorzugen, wenn dies gewünscht wird. Es wurde mir vorgeschlagen, dass ein Aspekt des C-Standards dies verhindert, aber ich war nicht in der Lage, eine seriöse Quelle zu finden.
Gilt dies als Bonusfrage auch für C ++ - Compiler?
Bearbeiten
Wenn die Antwort Ja lautet, können C / C ++ - Compiler Stapelvariablen neu anordnen. Können Sie ein Beispiel für einen Compiler nennen, der dies definitiv tut? Ich würde gerne eine Compiler-Dokumentation oder ähnliches sehen, die dies unterstützt.
Erneut bearbeiten
Vielen Dank für Ihre Hilfe. Das Beste, was ich für die Dokumentation finden konnte, ist das PapierOptimale Stack-Slot-Zuordnung in GCC(pdf), von Naveen Sharma und Sanjiv Kumar Gupta, die auf dem GCC-Gipfel 2003 vorgestellt wurden.
Das fragliche Projekt verwendete den ADS-Compiler für die ARM-Entwicklung. In der Dokumentation zu diesem Compiler wird erwähnt, dass die von mir gezeigte Reihenfolge von Deklarationen die Leistung und die Stapelgröße verbessern kann, da die ARM-Thumb-Architektur Adressen im lokalen Stapelrahmen berechnet. Dieser Compiler hat nicht automatisch die Ortsansässigen neu angeordnet, um dies auszunutzen. In dem hier verlinkten Artikel heißt es, dass GCC ab 2003 auch den Stapelrahmen nicht neu angeordnet hat, um die Referenzlokalität für ARM-Thumb-Prozessoren zu verbessern, aber dies impliziert, dass dies möglich ist.
Ich kann nichts finden, das definitiv besagt, dass dies jemals in GCC implementiert wurde, aber ich denke, dieses Papier gilt als Beweis dafür, dass Sie alle richtig sind. Danke noch einmal.