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.