Twitter und Facebook-Anbindung
X
Tweet Follow @twitterapi
!!! Anbindung an twitter und facebook öffnen !!!

Wenn Ihnen mein Online-Buch gefällt,
dann bedanken Sie sich doch mit einer kleinen Spende...

8.4.3 Strukturen für Profis

8.4.3 Strukturen für Profis

Wenn wir jetzt also das Byte Padding im Hinterkopf haben, sollten wir den Aufbau einer Struktur durchdenken. Strukturen werden in der Regel immer am Stück gehalten und in der Reihenfolge gespeichert, in der sie definiert wurden. Das hat zur Folge, dass ein Byte Padding auftritt und mehr Speicherplatz benötigt wird, als man bräuchte. Dem kann man entgegentreten, indem man die Reihenfolge ändert. Hier mal ein Beispiel.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
					
struct SLarger {
	char	a;	// 1 Byte
	int	b;	// 4 Byte
	char	c;	// 1 Byte
	short	d;	// 2 Byte
};

struct SSmaler {
	char	a;	// 1 Byte
	char	c;	// 1 Byte
	short	d;	// 2 Byte
	int	b;	// 4 Byte
};

// ...

printf("SLarger = %2i Byte\n", sizeof(SLarger));
printf("SSmaler = %2i Byte\n", sizeof(SSmaler));
					

Ausgabe:

SLarger = 12 Byte
SSmaler =  8 Byte
		

Wie Sie sehen können, besitzen beide Strukturen zwar den gleichen Inhalt, werden aber mit einer unterschiedlichen Größe im Speicher verwaltet. Folgende Grafik veranschaulicht dies noch einmal.

Speicherverwaltung von Strukturen mit Byte Padding

Die roten Bereiche sind die künstlich aufgefüllten Blöcke. Aber was hat das jetzt für folgen? Nur der extreme Programmierer setzt sich jedes Mal mit Taschenrechner hin und rechnet aus, in welcher Reihenfolge er was definiert. Sie können diesen Aspekt vorerst vernachlässigen. Viel wichtiger ist es, dass Ihr Programm läuft. Hinterher kann man optimieren. Dazu kommt, dass derartige Optimierungen eigentlich nur ins Gewicht fallen, wenn man sehr sehr viele dieser Strukturen benötigt (z.B. ein Array mit einer Million solcher Elemente). Falls ihr Programm aber mal schneller laufen könnte und oder zu viel Arbeitsspeicher benötigt wird, sind dies die ersten Ansatzpunkte im Quellcode, an denen man Zeit und Platz gutmachen kann.

Eine weitere Schlussfolgerung aus diesem Kapitel soll sein, dass die Größen von Arrays möglichst immer eine Zweierpotenz sein sollte. Es werden somit unnötige RAM Zugriffe gespart und jeder Zugriff nutzt den Bus vollständig aus.

Zum Seitenanfang
Zum Inhaltsverzeichnis

© Copyright by Thomas Weiß, 2009 - 2012