Datensegment
Werden Daten uninitialisiert im Datensegment angelegt, dann benötigen diese keinen Platz im ausführbaren Programm. In der ausführbaren Datei steht nur ein Vermerk wie viel Daten benötigt werden. Vom Programmlader wird dann die gewünschte Datenmenge im Datensegment mit Null initialisiert.
Wenn Daten initialisiert im Datensegment angelegt werden, dann wird die Ausführbare Datei größer.
Dies wollen wir experimentell bestätigen!
Etwas über Dateigrößen
Dateien werden in Blöcken gespeichert. Ist die Blockgröße zum Beispiel 512 Byte dann ist die minimale Dateigröße 512 Byte. Mit dieser Schrittweite wachsen dann auch Dateien. Das heisst um 513 Bytes zu speichern benötigt man 1024 Bytes auf der Festplatte.
Zur Demonstration erzeugen wir eine Datei, die nur eine 1 (und ein newline) enthält und überprüfen die Dateigröße:
$shell> echo "1" > small_file $shell> cat small_file 1 $shell> ls -s -k small_file 4 small_file
Die Blockgröße ist hier also 4KB = 4096Byte.
Beispiel Programm
In folgendem Programm werden die Arrays block1, ..., block4 entweder initialisiert oder uninitialisiert angelegt. Jedes Array hat eine Größe von 1KB. Außerdem kann noch zusätzlich die Variable little_more initialisiert oder uninitialisiert angelegt werden.
long double block1[64];
#else
long double block1[64] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 58, 59, 50,
61, 62, 63, 64};
#endif
#ifndef INIT_BLOCK2
long double block2[64];
#else
long double block2[64] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 58, 59, 50,
61, 62, 63, 64};
#endif
#ifndef INIT_BLOCK3
long double block3[64];
#else
long double block3[64] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 58, 59, 50,
61, 62, 63, 64};
#endif
#ifndef INIT_BLOCK4
long double block4[64];
#else
long double block4[64] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 58, 59, 50,
61, 62, 63, 64};
#endif
#ifndef INIT_LITTLE_MORE
char little_more;
#else
char little_more = 0;
#endif
int
main()
{
int size = sizeof(long double);
return size;
}
Wir übersetzen mehrfach und initialisieren jeweils einen Block mehr und am Ende noch die Variable little_more:
$shell> gcc-4.8 -o data data.c $shell> ls -s -k data 8 data $shell> gcc-4.8 -o data_b1 -DINIT_BLOCK1 data.c $shell> ls -s -k data_b1 12 data_b1 $shell> gcc-4.8 -o data_b2 -DINIT_BLOCK1 -DINIT_BLOCK2 data.c $shell> ls -s -k data_b2 12 data_b2 $shell> gcc-4.8 -o data_b3 -DINIT_BLOCK1 -DINIT_BLOCK2 -DINIT_BLOCK3 data.c $shell> ls -s -k data_b3 12 data_b3 $shell> gcc-4.8 -o data_b4 -DINIT_BLOCK1 -DINIT_BLOCK2 -DINIT_BLOCK3 -DINIT_BLOCK4 data.c $shell> ls -s -k data_b4 12 data_b4 $shell> gcc-4.8 -o data_b4 -DINIT_BLOCK1 -DINIT_BLOCK2 -DINIT_BLOCK3 -DINIT_BLOCK4 -DINIT_LITTLE_MORE data.c $shell> ls -s -k data_b4 16 data_b4