Il motivo è ridurre le dimensioni del programma. Immagina che il tuo programma C venga eseguito su un sistema embedded, in cui il codice e tutte le costanti vengono salvate nella vera ROM (memoria flash). In tali sistemi, deve essere eseguito un "copy-down" iniziale per impostare tutti gli oggetti di durata dell'archiviazione statica, prima che venga chiamato main(). In genere sarà così pseudo:
for(i=0; i<all_explicitly_initialized_objects; i++)
{
.data[i] = init_value[i];
}
memset(.bss,
0,
all_implicitly_initialized_objects);
Dove .data e .bss sono memorizzati nella RAM, ma init_value è memorizzato nella ROM. Se fosse stato un segmento, la ROM doveva essere riempita con molti zeri, aumentando significativamente le dimensioni della ROM.
Gli eseguibili basati su RAM funzionano in modo simile, sebbene ovviamente non abbiano una vera ROM.
Inoltre, memset è probabilmente un assemblatore inline molto efficiente, il che significa che il copydown di avvio può essere eseguito più velocemente.
Il .bss
segmento è un'ottimizzazione. L'intero .bss
segmento è descritto da un singolo numero, probabilmente 4 byte o 8 byte, che ne indica la dimensione nel processo in esecuzione, mentre il .data
section è grande quanto la somma delle dimensioni delle variabili inizializzate. Pertanto, il .bss
rende gli eseguibili più piccoli e più veloci da caricare. Altrimenti, le variabili potrebbero trovarsi nel .data
segmento con inizializzazione esplicita a zero; il programma farebbe fatica a capire la differenza. (In dettaglio, l'indirizzo degli oggetti in .bss
sarebbe probabilmente diverso dall'indirizzo se fosse nel .data
segmento.)
Nel primo programma, a
sarebbe nell'.data
segmento e b
sarebbe nel .bss
segmento dell'eseguibile. Una volta caricato il programma, la distinzione diventa irrilevante. In fase di esecuzione, b
occupa 20 * sizeof(int)
byte.
Nel secondo programma, var
è lo spazio allocato e l'assegnazione in main()
modifica quello spazio. Accade così che lo spazio per var
è stato descritto nel .bss
segmento anziché il .data
segmento, ma ciò non influisce sul modo in cui il programma si comporta durante l'esecuzione.