Alasannya adalah untuk mengurangi ukuran program. Bayangkan program C Anda berjalan pada sistem tertanam, di mana kode dan semua konstanta disimpan dalam ROM sebenarnya (memori flash). Dalam sistem seperti itu, "copy-down" awal harus dijalankan untuk menyetel semua objek durasi penyimpanan statis, sebelum main() dipanggil. Ini biasanya akan seperti pseudo ini:
for(i=0; i<all_explicitly_initialized_objects; i++)
{
.data[i] = init_value[i];
}
memset(.bss,
0,
all_implicitly_initialized_objects);
Di mana .data dan .bss disimpan di RAM, tetapi init_value disimpan di ROM. Jika hanya satu segmen, maka ROM harus diisi dengan banyak nol, meningkatkan ukuran ROM secara signifikan.
Executable berbasis RAM bekerja dengan cara yang sama, meskipun tentu saja mereka tidak memiliki ROM yang sebenarnya.
Selain itu, memset kemungkinan merupakan assembler inline yang sangat efisien, artinya penyalinan startup dapat dijalankan lebih cepat.
.bss
segmen adalah optimasi. Seluruh .bss
segmen dijelaskan oleh satu nomor, mungkin 4 byte atau 8 byte, yang memberikan ukurannya dalam proses yang berjalan, sedangkan .data
bagian sebesar jumlah ukuran variabel yang diinisialisasi. Jadi, .bss
membuat executable lebih kecil dan lebih cepat dimuat. Jika tidak, variabel bisa berada di .data
segmen dengan inisialisasi eksplisit ke nol; program akan kesulitan untuk membedakannya. (Secara rinci, alamat objek di .bss
mungkin akan berbeda dari alamat jika berada di .data
segmen.)
Pada program pertama, a
akan berada di .data
segmen dan b
akan berada di .bss
segmen yang dapat dieksekusi. Setelah program dimuat, perbedaan menjadi tidak penting. Saat dijalankan, b
menempati 20 * sizeof(int)
byte.
Pada program kedua, var
dialokasikan ruang dan tugas di main()
memodifikasi ruang itu. Kebetulan ruang untuk var
dijelaskan dalam .bss
segmen daripada .data
segmen, tetapi itu tidak memengaruhi perilaku program saat dijalankan.