Speicherausrichtung

Jedes Datenelement benötigt im Speicher eine bestimme Menge Platz. Diese Menge wird Größe des Datenelements genannt. Zusätzlich zur Größe müssen die Datenelemente aber auch korrekt im Speicher ausgerichtet sein, damit die CPU effizient auf die Daten zugreifen kann. Diese Ausrichtung nennt man "data alignment" oder "memory alignment". Für integrale Datentypen (keine structs/unions) entspricht sie immer der Größe eines Datenelements. Ein Datenelement mit Größe s an der Adresse a gilt dann als korrekt ausgerichtet, wenn a modulo s gleich 0 ist.

Das folgende Bild veranschaulicht den Zusammenhang. Wir kommen auf diese Graphik später zurück.

Graphische Darstellung von Speicherausrichtung im RAM

Legende: grün = korrekt ausgerichtet, rot = fehlerhaft ausgerichtet, blau = Padding Bytes

Im Allgemeinen müssen wir uns nicht um die Speicherausrichtung von Daten kümmern. Auf dem Stack sorgt der Compiler automatisch für eine korrekte Ausrichtung. Für den Heap gibt es Funktionen wie calloc(), die eine korrekte Ausrichtung ermöglichen. 

Hinweis: malloc() sorgt nicht für eine korrekte Ausrichtung auf dem Heap! Die meisten Programme funktionieren trotzdem, weil der Compiler dieses Problem kennt und versucht automatisch zu fixen. Für Intel und AMD Systeme gilt weiterhin der Abschnitt unten.


Fehlerhafte Speicherausrichtung

Werden Daten nicht korrekt ausgerichtet, muss die CPU die gewünschten Daten aufwendig rekonstruieren. Dazu lädt sie mehrere Datenblöcke und extrahiert dann die gewünschten Bytes. Intel und AMD CPUs führen diesen Vorgang automatisch aus. Eine fehlerhafte Speicherausrichtung führt so nur zu einer reduzierten Geschwindigkeit des Programms. Unter ARM ist die CPU nicht in der Lage die fehlerhafte Ausrichtung zu korrigieren. Das Programm stürzt ab.

Last modified: Friday, 18 May 2018, 12:51 PM