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?

War es hilfreich?

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.

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