Yığınlar, sonlu kayıt sayıları tarafından belirlenen sınırları zarif bir şekilde atlamamıza izin verir.
Tam olarak 26 küre "az" kaydettirdiğini düşünün (veya 8080 yongasının sadece 7 byte büyüklüğünde kayıtları bile vardır) Ve bu uygulamada yazdığınız her işlev bu düz listeyi paylaşır.
Naif bir başlangıç ilk birkaç kayıt ilk işleve tahsis etmek ve sadece 3 olduğunu bilmek, ikinci işlev için "d" ile başlamaktır ... Hızlı bir şekilde tükeniyor.
Bunun yerine, turbo makinesi gibi metaforik bir kasanız varsa, her bir işlevin kaseti kullanıp ileri ve geri () yerleştirerek "başka bir işlev çağrısı" başlatmasını sağlayabilirsiniz; istediği gibi kaydeder. Callee bittiğinde, callee'nin çıktısını gerektiği gibi nereye takacağını bilen ve sonra kaseti geriye döndürmek için kaseti geriye doğru çalar.
Temel çağrı çerçeveniz tam olarak budur ve standart makine kodu dizileri tarafından derlenir ve düşürülür, derleyici bir işlevden diğerine geçişlerin etrafına koyar. (C yığın çerçevelerimi hatırlamak zorunda olduğumdan bu yana çok zaman geçti, ancak X86_calling_conventions'da görevini bırakanların görevlerini okuyabiliyorsunuz .)
(özyineleme harika, ancak hiç bir kayıt olmadan yığınları dengelemek zorunda kalsaydınız, yığınları gerçekten takdir edersiniz .)
Sanırım artan sabit disk alanı ve programı depolamak ve derlemesini desteklemek için gereken RAM (sırasıyla) çağrı yığınlarını kullanmamızın nedeni. Bu doğru mu?
Bugünlerde daha fazla satır içi yapabilsek de ("daha fazla hız" her zaman iyidir; "daha az kb montaj" demek, video akış dünyasında çok az anlamına gelir).
Örneğin, polimorfik nesneler - verilecek tek ve tek nesne türünü bilmiyorsanız, düzleştiremezsiniz; Nesnenin özellikleri değişkenine bakmak ve bu işaretçiyi çağırmak zorundasınız ... çalışma zamanında yapılması önemsiz, derleme zamanında satır içi imkansız
Modern bir alet zinciri, arayan kişinin (lerin) tam olarak hangi objenin lezzetinin ne olduğunu bilmesi için yeterince düzleştiğinde polimorfik olarak tanımlanmış bir fonksiyonun içine girebilir :
class Base {
public: void act() = 0;
};
class Child1: public Base {
public: void act() {};
};
void ActOn(Base* something) {
something->act();
}
void InlineMe() {
Child1 thingamabob;
ActOn(&thingamabob);
}
Yukarıdakilerde, derleyici InlineMe'den içsel hareketine () ne olursa olsun () sırasında çalışma anında herhangi bir viyola dokunma gereksinimine kadar statik olarak inline etmeye devam etmeyi seçebilir.
Ama nesnenin hangi lezzet herhangi belirsizlik aynı işlevin diğer bazı dualar bile, ayrı bir işleve çağrısı olarak bırakacağım edilir inlined.