* Memory zaman "demek gerçekten derleme ayrılmış " ne demek? | Netgez.com
SORU
25 Ocak 2014, CUMARTESÄ°


* 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".

Back To Basics: Memory allocation, a walk down the history

CEVAP
25 Ocak 2014, CUMARTESÄ°


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.

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • akalyne

    akalyne

    13 Mayıs 2009
  • hans peder sahl

    hans peder s

    22 Temmuz 2009
  • Vladimir Jenko

    Vladimir Jen

    1 Mart 2010