Derleme zamanında ayrılan bellek, derleyicinin derleme zamanında çözüldüğü ve işlem belleğinin içinde belirli şeylerin tahsis edileceği anlamına gelir.
Örneğin, global bir dizi düşünün:
int array[100];
Derleyici derleme zamanında dizinin boyutunu ve bir büyüklüğünü int
bilir, bu nedenle derleme zamanında dizinin tüm boyutunu bilir. Ayrıca, genel bir değişkenin varsayılan olarak statik depolama süresi vardır: işlem belleği alanının statik bellek alanına (.data / .bss bölümü) ayrılır. Bu bilgi göz önüne alındığında , derleyici derleme sırasında dizinin o statik bellek alanının hangi adresinde olacağına karar verir .
Tabii ki bu bellek adresleri sanal adreslerdir. Program kendi tüm bellek alanına sahip olduğunu varsayar (örneğin 0x00000000'den 0xFFFFFFFF'ye). Bu nedenle derleyici "Tamam, dizi 0x00A33211 adresinde" gibi varsayımlar yapabilir. Çalışma zamanında bu adresler MMU ve OS tarafından gerçek / donanım adreslerine çevrilir.
Değer başlatılan statik depolama işleri biraz farklıdır. Örneğin:
int array[] = { 1 , 2 , 3 , 4 };
İlk örneğimizde, derleyici sadece dizinin nereye ayrılacağına karar vererek, bu bilgiyi yürütülebilir dosyaya kaydeder.
Değerle başlatılan şeyler durumunda, derleyici dizinin başlangıç değerini de yürütülebilir dosyaya enjekte eder ve program yükleyicisine program başlangıcında dizi ayırmadan sonra dizinin bu değerlerle doldurulması gerektiğini bildiren kod ekler.
Derleyici tarafından oluşturulan montajın iki örneği (x86 hedefi ile GCC4.8.1):
C ++ kodu:
int a[4];
int b[] = { 1 , 2 , 3 , 4 };
int main()
{}
Çıkış düzeneği:
a:
.zero 16
b:
.long 1
.long 2
.long 3
.long 4
main:
pushq %rbp
movq %rsp, %rbp
movl $0, %eax
popq %rbp
ret
Gördüğünüz gibi, değerler doğrudan montaja enjekte edilir. Dizide a
, derleyici 16 baytlık sıfır başlatma oluşturur, çünkü Standart statik olarak saklanan şeylerin varsayılan olarak sıfıra başlatılması gerektiğini söyler:
8.5.9 (Başlatıcılar) [Not]:
Statik depolama süresindeki her nesne, başka bir başlatma yapılmadan önce program başlangıcında sıfırdan başlatılır. Bazı durumlarda, ek başlatma daha sonra yapılır.
Her zaman insanların derleyicinin gerçekten C ++ kodu ile ne yaptığını görmek için kodlarını sökme öneririz. Bu, depolama sınıflarından / süresinden (bu soru gibi) gelişmiş derleyici optimizasyonlarına uygulanır. Derleyicinize montajı oluşturma talimatı verebilirsiniz, ancak bunu internette dostça bir şekilde yapmak için harika araçlar vardır. Benim favorim GCC Explorer .