* Memory zaman "demek gerçekten derleme ayrılmış " ne demek?
C ve C gibi programlama dillerinde , insanlar genellikle statik ve dinamik hafıza tahsisi bakın. Bu kavram ama "Tüm hafıza (ayrılmış) zaman" her zaman kafamı karıştırıyor. derleme sırasında ayrılmış cümleyi anlıyorum
Derleme anladığım kadarıyla, yüksek seviyede C/C kodu makine diline dönüştürür ve çalıştırılabilir bir dosya çıkarır. Nasıl bellek "tahsis" derlenmiş bir dosya mı ? Bellek her zaman tüm sanal bellek yönetimi falan RAM ayrılmış değil mi ?
Çalışma zamanı bir kavram tanımı ile bellek ayırma değil mi ?
Eğer 1 KB statik değişken C/C kodumu tahsis yaparsam, aynı miktarda tarafından çalıştırılabilir dosya boyutunu artırır ?
Bu cümle başlığı altında kullanıldığı sayfalar "Statik ayırma".
CEVAP
Hafıza derleme ayrılan bazı şeyler süreç bellek haritası içinde ayrılan yeri derleme zamanında derleyici giderir anlamına gelir.
Örneğin, küresel bir dizi düşünün:
int array[100];
Derleyici derleme dizinin boyutu ve bir boyutu derleme zamanında dizinin tüm boyutunu bilir, 5**, bilinmiyor. Ayrıca global bir değişken varsayılan olarak statik depolama süresi vardır: süreç bellek alanı statik bellek alanı tahsis edilir (.data/.bölüm Anti-Virus. Bu bilgi verilmişderleyici dizinin ne olacağını derleme sırasında karar verir.
Elbette bu bellek adresleri sanal adresler. Program kendi tüm bellek alanı (örneğin 0xFFFFFFFF 0x00000000) olduğunu varsayar. Derleyici varsayımlar gibi yapabilir o yüzden "Tamam, dizi 0x00A33211 adreste olacak". Zamanında adresleri TEB ve işletim sistemi tarafından gerçek/donanım adreslerine çevrilir.
Değeri statik depolama işleri biraz farklıdır başlatıldı. Örneğin:
int array[] = { 1 , 2 , 3 , 4 };
İlk örnekte, derleyici dizi tahsis edilecektir sadece, yürütülebilir, bu bilgileri saklama kararı aldı.
Durumunda değer başlatıldı şeyler, derleyici de enjekte başlangıç değer dizisi içine çalıştırılabilir, ve ekler kodu olan söyler programı loader bundan sonra dizi ayırma programı başlatın dizi olmalı dolu bu değerler.
Burada derleme derleyici tarafından oluşturulan iki örnek (GCC4.8.İle 86 1 Hedef):
C kod:
int a[4];
int b[] = { 1 , 2 , 3 , 4 };
int main()
{}
Çıkış montaj:
a:
.zero 16
b:
.long 1
.long 2
.long 3
.long 4
main:
pushq %rbp
movq %rsp, %rbp
movl $0, êx
popq %rbp
ret
Gördüğünüz gibi, değerleri doğrudan derleme içine enjekte edilir. Dizideki a
, derleyici Standart statik saklı şeyler varsayılan olarak başlatılan sıfır olması gerektiğini söylüyor, çünkü 16 bayt sıfır bir başlatma oluşturur:
8.5.9 (Başlatıcılar) [Not]:
Statik depolama süresi her nesne sıfır başlatılmış olur önce diğer program başlangıç laşması gerçekleşir başlangıç. Bazı doğduğunda ek başlatma sonra yapılır.
Hep demontaj insanları derleyici gerçekten C kodu ile ne yaptığını görmek için kendi kodunu öneririm. Bu gelişmiş derleyici en iyi duruma getirmeleri için depolama sınıfları/süre (bu soru gibi) geçerlidir. Derleyici derleme oluşturmak için talimat olabilir, ama samimi bir şekilde İnternet üzerinden bunu yapmak için harika bir araç vardır. Benim favorim GCC Explorer.
Ne demek &; Ara" programı " mı?...
Visual Studio "Herhangi bir CPU&q...
MySQL ve kötü nedir ve nasıl düzeltili...
Ve o zaman " imzasız" MySQL demek...
&; Uyarıları" quot; CoffeeScript ö...