Memori yang dialokasikan pada waktu kompilasi berarti kompiler menyelesaikan pada waktu kompilasi di mana hal-hal tertentu akan dialokasikan di dalam peta memori proses.
Misalnya, pertimbangkan array global:
int array[100];
Compiler mengetahui pada waktu kompilasi ukuran array dan ukuran suatu int
, sehingga ia mengetahui seluruh ukuran array pada waktu kompilasi. Juga variabel global memiliki durasi penyimpanan statis secara default: itu dialokasikan di area memori statis dari ruang memori proses (.data / .bss bagian). Mengingat informasi itu, kompilator memutuskan selama kompilasi di alamat mana dari area memori statis array .
Tentu saja alamat memori itu adalah alamat virtual. Program ini mengasumsikan bahwa ia memiliki seluruh ruang memori sendiri (Dari 0x00000000 hingga 0xFFFFFFFF misalnya). Itu sebabnya kompiler dapat melakukan asumsi seperti "Oke, array akan ada di alamat 0x00A33211". Pada saat runtime, alamat diterjemahkan ke alamat real / hardware oleh MMU dan OS.
Nilai yang diinisialisasi hal-hal penyimpanan statis sedikit berbeda. Sebagai contoh:
int array[] = { 1 , 2 , 3 , 4 };
Dalam contoh pertama kami, kompiler hanya memutuskan di mana array akan dialokasikan, menyimpan informasi itu di executable.
Dalam hal hal-hal yang diinisialisasi nilai, kompiler juga menyuntikkan nilai awal array ke dalam executable, dan menambahkan kode yang memberitahu program loader bahwa setelah alokasi array pada saat program dimulai, array harus diisi dengan nilai-nilai ini.
Berikut adalah dua contoh rakitan yang dihasilkan oleh kompiler (GCC4.8.1 dengan target x86):
Kode C ++:
int a[4];
int b[] = { 1 , 2 , 3 , 4 };
int main()
{}
Perakitan output:
a:
.zero 16
b:
.long 1
.long 2
.long 3
.long 4
main:
pushq %rbp
movq %rsp, %rbp
movl $0, %eax
popq %rbp
ret
Seperti yang Anda lihat, nilai langsung disuntikkan ke majelis. Dalam array a
, kompiler menghasilkan inisialisasi nol 16 byte, karena Standar mengatakan bahwa hal-hal yang tersimpan statis harus diinisialisasi ke nol secara default:
8.5.9 (Inisialisasi) [Catatan]:
Setiap objek durasi penyimpanan statis nol diinisialisasi pada startup program sebelum inisialisasi lainnya terjadi. Dalam beberapa kasus, inisialisasi tambahan dilakukan kemudian.
Saya selalu menyarankan orang untuk membongkar kode mereka untuk melihat apa yang sebenarnya dilakukan oleh kompiler dengan kode C ++. Ini berlaku dari kelas / durasi penyimpanan (seperti pertanyaan ini) hingga optimisasi kompiler tingkat lanjut. Anda bisa menginstruksikan kompiler Anda untuk membuat perakitan, tetapi ada alat yang bagus untuk melakukan ini di Internet dengan ramah. Favorit saya adalah GCC Explorer .