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.

#ifndef INIT_BLOCK1
long double block1[64];
#else
long double block1[64]  = { 1,  2,  3,  4,  5,  6,  7,  8,  910,
                           11121314151617181920,
                           21222324252627282930,
                           31323334353637383940,
                           41424344454647484950,
                           51525354555657585950,
                           61626364};
#endif

#ifndef INIT_BLOCK2
long double block2[64];
#else
long double block2[64]  = { 1,  2,  3,  4,  5,  6,  7,  8,  910,
                           11121314151617181920,
                           21222324252627282930,
                           31323334353637383940,
                           41424344454647484950,
                           51525354555657585950,
                           61626364};
#endif

#ifndef INIT_BLOCK3
long double block3[64];
#else
long double block3[64]  = { 1,  2,  3,  4,  5,  6,  7,  8,  910,
                           11121314151617181920,
                           21222324252627282930,
                           31323334353637383940,
                           41424344454647484950,
                           51525354555657585950,
                           61626364};
#endif

#ifndef INIT_BLOCK4
long double block4[64];
#else
long double block4[64]  = { 1,  2,  3,  4,  5,  6,  7,  8,  910,
                           11121314151617181920,
                           21222324252627282930,
                           31323334353637383940,
                           41424344454647484950,
                           51525354555657585950,
                           61626364};
#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