C ++, Free-Store vs Heap


124

Dinamik tahsisler new/deleteare gerçekleşecek söylenen serbest mağazada ,
süre malloc/freeoperasyonlar kullanmak yığın .

Pratikte gerçek bir fark olup olmadığını bilmek isterim.
Derleyiciler iki terim arasında bir ayrım yapar mı? ( Ücretsiz mağaza ve Yığın , değil new/malloc)

Yanıtlar:


76

Bkz. Http://www.gotw.ca/gotw/009.htm ; yığın ve ücretsiz mağaza arasındaki farkları benim yapabildiğimden çok daha iyi açıklayabilir:

Serbest mağaza:

Ücretsiz depo, yeni / sil ile ayrılan / serbest bırakılan iki dinamik bellek alanından biridir. Nesne ömrü, depolamanın ayrıldığı süreden daha az olabilir; yani, serbest depo nesneleri, hemen başlatılmadan ayrılmış belleğe sahip olabilir ve bellek hemen serbest bırakılmadan yok edilebilir. Depolamanın tahsis edildiği süre boyunca, ancak nesnenin ömrü dışında, depolamaya bir boşluk * aracılığıyla erişilebilir ve manipüle edilebilir, ancak proto-nesnenin statik olmayan üyelerine veya üye işlevlerine erişilemez, adresleri alınamaz veya başka şekilde manipüle edilemez. .

Yığın:

Yığın, malloc / free ve türevleri tarafından ayrılan / serbest bırakılan diğer dinamik bellek alanıdır. Varsayılan genel yeni ve silme, malloc açısından uygulanabilir ve belirli bir derleyici tarafından serbest bırakılabilirken, yığının boş depoyla aynı olmadığını ve bir alana ayrılan belleğin diğerinde güvenli bir şekilde kaldırılamayacağını unutmayın. Yığından ayrılan bellek, yeni yerleştirme ve açık yok etme yoluyla sınıf türü nesneler için kullanılabilir. Eğer öyleyse, ücretsiz mağaza nesnesi ömrü hakkındaki notlar burada benzer şekilde geçerlidir.


23
Katılmıyorum. Dinamik ayırma bağlamında "yığın" kelimesi ne C ++ standardı ne de C99 tarafından kullanılmaz (C ++ 'nın ifade ettiği C89'um yok, kelimeyi kullanıyorsa beni düzeltmekten çekinmeyin). Söz konusu GotW'nin yayınlandığı tarihi bulamadım, ancak taslaktan bahsettiği için, açıkça standart öncesi.
avakar

2
Bu tamamen terminoloji meselesi, imho. Sayın Bay. Stroustrup, 'yığın' ve 'ücretsiz mağaza' arasında ayrım yapmaz: stroustrup.com/Programming/17_free_store.ppt , slayt 12. bellek ayırma için yığın veri yapısı.
Alexey Voytenko

Yığını genellikle (maloc / free yoluyla) bir tür 'hammadde' tedarikçisi olarak düşünüyorum. Bir yığın bellek istedin, onu fırfırsız aldın. Herhangi bir yapıyı kendiniz inşa etmelisiniz. Ücretsiz Mağaza (yeni / sil) daha çok bir 'bitmiş ürün' tedarikçisi gibidir. Bir nesne istersiniz ve ona biraz alan tahsis edilir ve oluşturduğu nesne sizin kullanımınız için hazırlanır. Bittiğinde güzelce temizlenir.
Anshuman Kumar

67

C ++ için, ücretsiz mağaza ile yığın arasındaki fark tamamen kavramsal hale geldi. Böcek toplamak için bir kavanoz ve çerez toplamak için bir kavanoz gibi. Biri bir şekilde etiketlenir, diğeri. Bu atama, " new" ve " delete" " malloc", " realloc" veya " free" (veya bu konu için bit seviyesi kümeleri) ile ASLA karıştırmadığınız noktayı eve götürmek içindir .

Görüşmeler sırasında 's iyi olduğunu söylemek "için newve deleteücretsiz depoyu kullanmak, mallocve freeyığın kullanın; newve deletebununla birlikte sırasıyla yapıcı ve yıkıcı, çağrı mallocve freeyok." Yine de, çoğu zaman bellek bölümlerinin gerçekten aynı alanda olduğunu duyacaksınız - bununla birlikte, bu CAN derleyiciye özel olabilir, yani her ikisinin de farklı bellek alanlarını havuzlar olarak atayabilmesi mümkündür (neden olduğundan emin değilim, rağmen).


28

Mike Koval'ın cevabı teoriyi oldukça iyi kapsıyor. Ancak pratikte bunlar neredeyse her zaman aynı bellek bölgesidir - çoğu durumda derleyicinin uygulamasına newgirerseniz, çağrıları bulacaksınız malloc().

Başka bir deyişle: makinenin bakış açısından, yığın ve ücretsiz depolama aynı şeydir. Ayrım, derleyicinin içinde mevcuttur.

İşleri daha da kafa karıştırıcı hale getirmek için, C ++ 'nın ortaya çıkmasından önce, şimdi "bedava mağaza" olarak adlandırılan şeyi ifade etmek için "yığın" dedik.


5

"Yığın" terimi ayrıca belirli bir veri yapısına da atıfta bulunabilir, ancak C ++ malloc, free, new ve delete işlemleri bağlamında "heap" ve "free store" terimleri az çok birbirinin yerine kullanılır.


3

Yığın ve ücretsiz mağazanın birlikte çalışabilir olması gerekmiyor. C ++ 11 Standard Library ile AVR 8-bit mikro denetleyicilerde olduğu gibi kısıtlı bağlamlarda, aynı programda bile kullanılamazlar. Serbest depo ve yığın, tahsislerini aynı bellek alanında, birbirlerinin yapılarının ve verilerin üzerine yazarak yapar. Bu bağlamda, Free store farklıdır ve Heap ile uyumsuzdur çünkü "yeni / ücretsiz mağaza kitaplığını sil", "Malloc / free / realloc / calloc yığın kitaplığı" ndan daha basit (ve daha hızlı) ve bu nedenle, C ++ gömülü programcı (yalnızca 512 bayt RAM'iniz olduğu bir bağlamda).

Https://github.com/ambroise-leclerc/ETL/tree/master/libstd adresindeki 8-bit c ++ 11/14 Standart Kitaplığa bakın


2

Ve push_heapdiğerleri gibi yığın işlevlerinin açıklamaları dışında, öbek sözcüğünden söz eden standardı hiç hatırlamıyorum . Tüm dinamik ayırmalar ücretsiz mağazada gerçekleştirilir.


1

Free Store, programın yürütülmesi sırasında dinamik ayırma için program tarafından kullanılan bir programa verilen ayrılmamış yığın bellek havuzudur. Her program, yürütme sırasında kullanabileceği, ayrılmamış bir yığın bellek havuzuyla sağlanır. Bu kullanılabilir bellek havuzuna programın ücretsiz deposu adı verilir. Tahsis edilen boş depo hafızası isimsiz.

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.