Kitaplar neden “derleyici bellekteki değişkenler için yer ayırıyor” diyor?


18

Kitaplar neden "derleyici bellekteki değişkenler için yer ayırıyor" diyor. Bunu yapan yürütülebilir değil mi? Yani, örneğin, aşağıdaki programı yazarsam,

#include <iostream>
using namespace std;

int main()
{
   int foo;
   return 0;
}

ve derlemek ve bir yürütülebilir (olsun program.exe olsun), şimdi, ben program.exe çalıştırırsanız, bu yürütülebilir dosya kendisi değişken foo için biraz yer ayırmak için komut verecektir. Öyle değil mi? Lütfen kitapların neden "derleyici bunu yapacak ... bunu yap" dediğini açıklamaya devam edin.


11
hangi kitaplardan bahsediyorsun
wirrbel

4
"İlgili sorunuz" ayrı bir soru olmalıdır.
SShaheen


Derleyici bunu yapan veya söyledikleri kod üretir. doğrudan veya dolaylı.
old_timer

Bilginize stackoverflow.com/questions/7372024/... bir derleyici uğruna hafızasında algılanan değişkenin yerini değiştirmeye karar olabileceğini ve not hizalama örneğin: stackoverflow.com/questions/17774276/...
NoChance

Yanıtlar:


20

Programınız çalıştığında derleyicinin gittiği konusunda haklısınız. Ve farklı bir makinede çalışıyorsa, derleyici artık mevcut değildir.

Sanırım bu, kendi kodunuz tarafından tahsis edilen bellek arasında net bir ayrım yapmaktır. Derleyici, programınıza bellek tahsisi yapan bir kod ekler (yeni, malloc veya benzeri komutları kullanmak gibi).

Kitaplar derleyicinin kod dosyalarınızda açıkça belirtilmeyen bazı kodlar eklediğini söylemek için genellikle "derleyici bunu veya bunu yapar" ifadesini kullanır. Bunun tam olarak ne olduğu doğru değil. Bu bakış açısından, öğreticilerde bahsedilen birçok şey yanlış olurdu, ancak ayrıntılı açıklamalara ihtiyaç duyacaktır.


Evet, buna inandım. Hızlı bir cevap için teşekkürler!
Barışçıl Kodlayıcı

12
derleyici yığındaki değişken fooyu derleme sırasında yığın işaretçisine bir ofset ile değiştirerek ayırır. mallocEt tarafından yapılan yığın tahsisi ile ilgili değildir . ark.
wirrbel

@holger: İtirazınız elbette teknik olarak doğrudur. Ancak, program kullanılmadan önce başladığında yığın alanı ayrılmalıdır (bazen CPU mimarisine bağlı olarak çeşitli şekillerde olabilir). Bunun nasıl olduğunu bazı ayrıntılar bulmaya çalıştım ama çok başarılı olamadım.
thorsten müller

2
Ana iş parçacığı için yığın boyutu bağlayıcı tarafından ayrılmış ve daha sonra işletim sistemi tarafından ele düşünüyorum. Özel iş parçacıkları için yığın tahsisine daha benzerdir, yani arayan çalışma zamanında boyutu düzeltebilir.
wirrbel

4

Değişkene bağlıdır. İşletim sistemi yığın tahsis eder, program yığın tahsis eder ve derleyici globaller / statik için alan tahsis eder, yani exe'nin içine yerleştirilir. 1 MB global bellek ayırırsanız, exe boyutunuz en az 1 MB artar


1
Bu soru bununla ilgili değil.
Philipp

2
aslında soruya burada listelenen diğer cevaplardan daha yakındır.
wirrbel

@James Ah, bu benim deneyimim değil. Örneğin, int test[256][1024]; int main(){ test[0][0]=2; return 0; } Bu küçük program 1MB tahsis edilmiştir, ancak bana yalnızca 1.4 Kb nesne dosyası ve 8.4 Kb yürütülebilir dosyası oluşturur. Yine de doğru miktarda RAM kullanmalıdır.
Garet Claborn

1
Sadece globaller için depolanan tahsis komutları değil mi? İnt veya char gibi ilkelleri kullanarak tüm değerleri sabit kodladıysanız, yürütülebilir dosyanın boyutu kesinlikle eklenen değişken miktarından daha fazla artacaktır. Gibi int a1=1,a2=2,... tüm yol ... , a1048576=1048576;Sadece o zaman kesinlikle 1mb daha büyük bir şey alırsınız bence.
Garet Claborn

2
Ne exe BSS bölümüne veri koyar
James

4

derleyicinin yapacağı kodunuzu alıp makine koduna derlemektir. Bahsettiğiniz şey, bir derleyicinin yalnızca çevirmesi gereken iyi bir örnektir.

Örneğin, yazarken

int foo;

'Derleyiciye [ oluşturduğu çıktıda ] bilgisayarın daha sonra başvurabileceğim bir int için yeterli koç ayırmasını istediğini söylerken, derleyici muhtemelen bir kaynak kimliği veya makine kodu, montaj yazmak yerine bir metin dosyasında foo kullanmak olsun! Yaşasın !

Derleyiciye tüm hedeflenen işlemcilere ve cihazlara bir mektup ( veya belki de bir roman / ansiklopedi ) yazdığı için buna da bakabilirsiniz . Mektup, (genel olarak) hedef değiştirilerek farklı işlemcilere çevrilebilecek ikili sinyallerle yazılır. Herhangi bir 'harf' ve / veya birleşik her türlü istek ve / veya veri gönderiyor olabilir - lütfen programcının kullandığı bu değişken için alan ayırın.


3

"Derleyici hafızayı ayırır" demek gerçek anlamda doğru olmayabilir, ancak doğru şekilde düşündüren bir metafor.

Gerçekte olan şey, derleyicinin kendi belleğini ayıran bir program oluşturmasıdır. Bunun dışında belleği ayıran program değil, işletim sistemi.

Gerçekte olan şey, derleyicinin bellek gereksinimlerini tanımlayan bir program oluşturması ve işletim sisteminin bu açıklamayı alması ve belleği ayırmak için kullanmasıdır. İşletim sisteminin bir program olması ve programların aslında hiçbir şey yapmaması dışında, CPU tarafından gerçekleştirilen bir hesaplamayı tanımlarlar. CPU'nun sadece karmaşık bir elektronik devre olması dışında, antropomorfize edilmiş küçük bir homonculus değil.

Ancak programları, derleyicileri ve CPU'ları gerçekte oldukları için değil, bilgisayarın içinde yaşayan küçük insanlar olarak düşünmek mantıklıdır, çünkü bu insan beynine iyi uyan bir metafordur.

Bazı metaforlar, bir soyutlama düzeyindeki şeyleri tanımlamak için iyi çalışır, ancak başka bir düzeyde de iyi çalışmaz. Derleyicinin düzeyi üzerinde düşünürseniz, derlenen program gerçekten "bellek ayırma" olarak çalıştırıldığında bellek tahsis edilmesine neden olacak kod üretme eylemini açıklamak mantıklıdır. Bir derleyicinin nasıl çalıştığını düşündüğümüzde, doğru fikrimiz var ve ne yaptığımızı unutamayacağımız kadar uzun soluklu değil. Bu metaforu derlenmiş programın seviyesinde kullanmaya çalışırsak, garip bir şekilde yanıltıcıdır, fark ettiğiniz şey budur.


0

Bir değişkeni nerede saklayacağına karar veren derleyici - yığın veya ücretsiz kayıtta olabilir. Derleyici tarafından alınan depolama kararı ne olursa olsun, bu değişkene erişmek için ilgili makine kodu üretilir ve çalışma zamanında değiştirilemez. Bu anlamda, derleyici değişkenler için yer ayırmaktan sorumludur ve son program.exe sadece körü körüne çalışma zamanında bir zombi gibi davranır.

Şimdi, bunu malloc gibi farklı dinamik bellek yönetimi ile karıştırmayın, yeni veya kendi bellek yönetiminiz olabilir. Derleyiciler değişken depolama ve erişim ile uğraşır, ancak başka bir çerçevede / kütüphanede gerçek değerin ne anlama geldiğini umursamaz. Örneğin:

byte* pointer = (byte*)malloc(...);

Çalışma zamanında malloc rasgele bir sayı döndürebilir, ancak derleyici umursamaz, tek umurunda bu sayının nerede saklanacağı.


0

Daha doğru bir ifade: - "derleyici yükleyiciye değişkenler için yer ayırmasını söyler"

Bir C-ish ortamında değişkenler için üç tip alan olacaktır: -

  • statik değişkenler için sabit bir blok
  • Genellikle "yığın" olarak adlandırılan "otomatik" değişkenler için büyük bir blok. Fonksiyonlar girişte bir yığın alır ve dönüşte serbest bırakır.
  • Program tarafından yönetilen belleğin (malloc () veya benzeri bir bellek yönetimi API'sı kullanılarak ayrıldığı "yığın" adı verilen büyük bir blok.

Modern bir işletim sisteminde yığın belleği aslında ayrılmış değil, gerektiği gibi tahsis edilecektir.


0

Evet, haklısınız, bu durumda (bir işlevdeki bir değişkeni bildirmek), kitabınızın cümlesi muhtemelen yanlıştır: bir işlevdeki bir değişkeni bildirdiğinizde, işleve girdikten sonra yığına tahsis edilir. Her neyse, bir derleyici durumu optimize etmelidir: işlev özyinelemeli değilse ( main()bunun için iyi bir adaysa), derleme süresini (BSS'de) "ayırmak" sorun değildir.

(Değişkenlerinizin nerede olduğunu merak ediyorsanız, kirli bir yolla kontrol edebilirsiniz (eğer obj dosyası yapısını incelemek istemiyorsanız, neden olmasın?), Böylece bazı farklı değişkenleri bildirebilirsiniz: sabit, statik, dinamik, malloc()ayrılmış, ve adreslerini görüntüleyin ( daha iyi okunabilirlik için %Xbiçimlendiriciyi kullanın printf()). Yığında bulunan değişkenler çok farklı bellek adreslerine sahip olacaktır.)


0

Çalışma zamanında yapılan tek şey, yığın poinbter'ı belirli bir miktarda çarpmak olacaktır. Derleyici önceden karar verir:

  • işlev için ne kadar yığın alanına ihtiyaç duyulacağı.
  • Yığın işaretçisinden hangi ofsette her değişken değişecektir.

Bu "ayırma" olarak adlandırılabilir, ancak elbette, derleme süresi boyunca yalnızca derleyicinin çalışan programın modelinde yer alır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.