SORU
30 AĞUSTOS 2015, Pazar


Nasıl değişkenler yığında kaydeder veya bilinen?

isocpp FAQ kod inline olarak verilir hakkında bu soruyu okuyorum

void f()
{
  int x = /*...*/;
  int y = /*...*/;
  int z = /*...*/;
  // ...code that uses x, y and z...
  g(x, y, z);
  // ...more code that uses x, y and z...
 }

diyor ki o zaman

Kayıtları, tipik bir C uygulaması varsayarak ve bir yığın, kaydeder ve parametreleri önce yığın için yazılmış g() parametreler okunur. sonra bir ara içinde yığın g() ve yine g() geri dönerken kayıtları geri yüklemek için okuyun f(). Ama bu gereksiz okuma ve yazma bir sürü, özellikle ... derleyici değişkenleri için kayıtları kullanmak mümkün bulunduğu durumlarda x, y z: Her değişken iki kez (bir kayıt ve yazılı olarak alabilir ayrıca parametre olarak) ve iki kez (g() içinde kullanılan ve okuyun f()) dönüş sırasında kayıtları geri.

Büyük bir zorluk yukarıdaki paragraf anlama var. Sorularımı aşağıda listesi için deneyin:

  1. Bir bilgisayar ana bellek üzerinde bulunan bazı veriler üzerinde bazı işlemler yapmak için, veri, kayıt için önce yüklenmiş olmalıdır CPU verileri üzerinde çalışabilir o zaman doğru mu? (Bu soru için özellikle C ile ilgili değil biliyorum , ama bu anlayış C nasıl çalıştığını anlamak için yararlı olacaktır.)
  2. f() g(x, y, z) aynı fonksiyonu bir fonksiyon olduğunu düşünüyorum. Nasıl g() kaydeder ve parametreleri g() ile aktarılır çağırmadan önce x, y, z yığın?
  3. Nasıl x, y, z bildirimleri kaydeder onları saklı yapmak, belli mi? Verileri nereden g() saklı içinde, kayıt yığını ya?

PS

Çok sert cevaplar çok iyi her zaman kabul edilebilir bir cevap seçin(E. g., bence olanlar@, @TheodorosChatzigiannakis ve @superultranova MatsPeterson) tarafından sağlanan. Ben şahsen @tarafından bir cevap bazı kurallar bulunmaktadır bu yana biraz daha Potatoswatter gibi.

CEVAP
30 AĞUSTOS 2015, Pazar


Bu paragraf çok ciddiye almayın. Aşırı varsayımlar yapmak ve daha sonra çok yaygın bir şey olamaz aşırı ayrıntı, girecek gibi görünüyor.

Ama sorularınız çok iyi.

  1. Bir bilgisayar ana bellek üzerinde bulunan bazı veriler üzerinde bazı işlemler yapmak için, veri, kayıt için önce yüklenmiş olmalıdır CPU verileri üzerinde çalışabilir o zaman doğru mu? (Bu soru için özellikle C ile ilgili değil biliyorum , ama bu anlayış C nasıl çalıştığını anlamak için yararlı olacaktır.)

Daha fazla veya daha az, her şeyi kaydeder yüklü olması gerekir. Çoğu bilgisayar bir çevresinde düzenlenmiştirveriyoluotobüs kayıtları, aritmetik devreler ve hafıza hiyerarşisinin üst düzey bağlanıyor. Genellikle, veriyolu üzerinde yayın olan bir şey bir kayıt ile tanımlanır.

Büyük RISC CISC vs tartışmaları hatırlarsınız. Önemli noktalardan biri, bilgisayar tasarım hafızayı doğrudan aritmetik devreler bağlanmak için izin değil, çok daha basit olabilir.

Modern bilgisayarların içinde vardırmimari kaydederbir programlama yapısı değişken, ve gibifiziksel kaydedergerçek çevrimler., Derleyici mimari kayıtları açısından bir program oluşturulurken fiziksel kayıtları izlemek için ağır kaldırma bir sürü yapar. 86, bu doğrudan aritmetik işlemler için bellekte işlenen gönderme talimatları üreten gerektirebilir gibi CISC bir talimat için ayarlayın. Ama perde arkasında, kaydeder indir.

Sonuç: Sadece derleyici onun bir şey yapalım.

2=başlangıç
  • Bence f() g(x, y, z) fonksiyonu gibi bir fonksiyon bir şekilde aynıdır. Nasıl x, y, z g çağırmadan önce gel() kaydeder ve parametreleri g geçirilir() yığını?
  • Her platformda birbirlerini çağırmak için C fonksiyonları için bir yol tanımlar. Kayıtlarına geçen parametreleri daha etkilidir. Ancak, ticaret-off vardır ve kaydeder sayısı sınırlıdır. Eski ABİs daha sık basitlik verimlilik için feda etti, ve tüm yığını üzerine koydu.

    Sonuç: Bu örnek, keyfi olarak saf bir ABİ üstleniyor.

    3=başlangıç
  • Nasıl x, y, z için bildirimleri kaydeder, onları saklı yapmak, belli mi? Veri g içinde) saklanır, kayıt yığını ya?
  • Derleyici daha sık erişilen değerler için kaydeder kullanmayı tercih eğilimindedir. Örnekte hiçbir şey kullanımı yığın gerektirir. Ancak, daha az erişilen değerler yığında daha fazla kayıtları kullanılabilir hale getirmek için yerleştirilir.

    Bir değişken, &x gibi Adres almak veya başvuru ve adres yoldan geçerken inliner kaçar, derleyici gerekli bellek ve kayıtları kullanın.

    Sonuç: adreslerini alıp onları istesekte istemesekte. depolama geçirmeden Önlemek

    Bunu Paylaş:
    • Google+
    • E-Posta
    Etiketler:

    YORUMLAR

    SPONSOR VİDEO

    Rastgele Yazarlar

    • Edgar flores

      Edgar flores

      7 HAZİRAN 2006
    • FOSDEM

      FOSDEM

      13 Ocak 2009
    • Julian Smith

      Julian Smith

      31 EKİM 2006