0

Yığının ne olduğunu ve nasıl çalıştıklarını biliyorum. Ayrıca, her işlevin kendi yığında bellekte ayrıldığını biliyorum ve bu da kapsamı oluşturur. ama kafamı karıştıran şey, derleyicinin bu isimlerin bu kapsamda nasıl beyan edildiğini öğrenmesi. verilen isim için bir giriş varsa bu bütün yığını ve kontrolleri izlerken yapar (o yorucu görünüyor) bu kodu göz önünde bulundurun:. Fonk yığını bir ama girdisini içerecektirDerleyici kapsamı nasıl çözer?

void func(int a) 
{ 
    cout<<a; 
    cout<<b; 
} 

burada derleyici, b adıyla karşılaşır, yığını kontrol eder ve b için bir giriş olmadığını öğrenir. şimdi soru nasıl kontrol edeceği, bütün yığını açıyor mu. ve Bu işlev b içeren başka bir işlev içinde bildirilirse, diğer tüm yığınları da açmak zorundadır.

+0

Bu işlevin kendi yığını yok. İşlev, işlem yığını üzerinde bir yığın çerçevesi ayırır. Bu, çalışma zamanında gerçekleşir, zamanı derlemez. Aşağıdaki yanıtta belirtildiği gibi, derleyici, kapsam sorunlarını çözmek için sembol tablolarının bir hiyerarşisini (veya mantıksal eşdeğerini) kullanır. –

cevap

4

Derleyiciler, değişkenlerin kapsamını sembol tabloları aracılığıyla çözümler. Her kapsam kendi sembol tablosunu alır ve bu tablolar programın yapısına bağlı olarak hiyerarşik bir biçimde düzenlenir.

Derleyici bir değişkenin kapsamını çözmek istediğinde, öncelikle geçerli kapsamın sembol tablosundaki varlığını kontrol eder. Bulunmazsa ana kapsamın sembol tablosunu ve benzerlerini deneyecek.

Her sembol tablosunun aranması nispeten hızlı olmalıdır. Görsel bir örnek için bkz here.