Speicherbelegung von lokalen Variablen
Frage
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}
Wir müssen diese Speicher erinnern kann nur werden in Vielfachen des Wortes adressiert Größe. Ein Wort in unserem Fall ist 4 Bytes, oder 32 Bit. So ist unser 5-Byte-Puffer gehen nehmen 8 Bytes (2 Wörter) wirklich Speicher und unser 10-Byte-Puffer gehen 12 Bytes nehmen (3 Wörter) von Erinnerung. Deshalb SP ist sein subtrahiert um 20.
Warum ist es nicht ceil ((5 + 10) / 4) * 4 = 16?
Lösung
Da einzelne Variablen ausgerichtet werden soll. Mit Ihrer vorgeschlagenen Formel, dann würden Sie nur die erste Variable auf dem Stapel auszurichten, folgende Variablen unaligned verlassen, die für die Leistung schlecht ist.
Dies wird auch als „Verpackung“ bekannt und kann in C / C ++ mit Pragmas getan werden, aber nur in sehr speziellen Fällen sinnvoll und kann sowohl für die Leistung und als Ursache möglicher Laufzeitfallen gefährlich sein. Einige Prozessoren erzeugen Fehler auf nicht ausgerichtete Zugriffe zur Laufzeit, die das Programm abstürzen.
Andere Tipps
Die Variablen auf Ihre Architektur sind individuell ausgerichtet. buffer1 erhält aufzurunden 8 und buffer2 bis 12, so dass beide ihre Startadressen sind 4-Byte-ausgerichtet ist. So 8 + 12 = 20.