2016-03-27 15 views

cevap

0

Bu alloc uygulama

Bu statik bir tampon dayalı bir malloc benzeri işlevi uygulayan (ama dağıttı tampon izlenmez çünkü free tahsis tampon izin vermez) döndürür. Kullanmak istediğiniz bayt sayısıyla alloc numaralı telefonu arayın ve arabellek için bir işaretçi ya da arabellek kullanılamıyorsa 0'ı işaretleyin. Hadi kıracağız.

static char allocbuf[ALLOCSIZE]; 
static char *allocp = allocbuf; 

allocbuf verileri tutmak için gidiyor fiili tampon olduğunu. Onunla çalışmak için şimdi tamponun başlangıcını işaret eden bir işaretçi allocp kullanıyoruz. Bir tampon istendiğinde, önceden kullanılan arabellek parçalarının talebi karşılamak için yeterli alan bırakıp açmadığını kontrol ediyoruz. Bu işaretçi için aritmetik kullanılır: tamponun sonunu hesaplar (allocbuf ve ALLOCSIZE ekleyerek), ardından kullanılmayan arabelleğin (allocp) başlangıcını çıkarırız. Bu, arabellekte bırakılan bayt sayısını verir ve sonra istenen baytların daha az olup olmadığını kontrol edebiliriz. Biz yeterli tampon varsa

{ 
     allocp += n; 
     return allocp - n; 
    } 
    else 
     return 0; 
} 

biz allocp artar. Şimdi, sadece tahsis ettiğimiz tampon bölümünün ardından ilk baytı işaret ediyor. Ardından, ayırdığımız arabellek bölümünün başına bir işaretçi döndürürüz, böylece arayan kişi bunu kullanabilir. Arayana, malloc'a benzer: bir arabellek ister ve ona bir işaretçi veya NULL. Geçerli bir işaretçi alırsanız, o zaman kullanabilirsiniz.

Bu, arayanın alloc numarasını birden çok kez çağırmasına ve her defasında boş yer kaldığı sürece arabelleğin yeni bir parçasının işaretlenmesine izin verir.Verileri işlemek gerekir ama derleme zamanında boyutu hakkında bilmiyorum dinamik bellek

Kullanım

Basitçe söylemek gerekirse, dinamik hafıza kullanılır.

Örneğin, bir dosyadan veri okuyorsanız, derleme sırasında belirttiğiniz boyutta bir statik arabellek kullanabilirsiniz, ancak daha büyük dosyaları okuyamazsınız (veya okumak için özel bir işlem eklemeniz gerekir) dosyaları yığın halinde, ancak uygulamanıza bağlı olarak çalışmayabilir).

Şimdi, belleği dinamik olarak ayırırsanız, derleme sırasında ayarladığınız boyutla sınırlı değilsiniz. Daha sonra her boyuttaki dosyaları okuyabilir (sadece bilgisayarınızda mevcut hafızayla sınırlıdır.)

malloc sayfalardan (bu) farklılıkların bir çift var alloc

, burada önemli olanları odaklanacağız .

İlk olarak, verilerin yerleştirildiği farklı konumlar vardır. Değişkenler yığınının üzerine yerleştirilir, global veriler bss veya veri (bölümün başlangıcına göre değişir.) Bölümüne yerleştirilir. Ayrıca, bu bölümler sisteminize ve derleyicinize bağlı olarak biraz farklı olarak adlandırılabilir. Dinamik bellek yığın adlı bir bölüm kullanır.

Bu alloc uygulaması, statik olarak ayrılmış bir arabellek kullanır, böylece veriler bss bölümüne yerleştirilir. malloc bunun yerine yığını kullanır. İkinci olarak, bu uygulama malloc'dan çok daha sınırlı bir şekilde gerçekleştirilmiştir. malloc ile birlikte bir arabelleği tekrar serbest bırakan free gelir. alloc statik tampon boyutunu kullandığından Ayrıca, bu boyutuyla sınırlı olması - malloc bilgisayar ile sınırlıdır

Sen sınırlı üzerinde alloc gibi bir uygulama kullanacağız (kullanılabilir bellek, yolu işletim sistemi bellek vb kolları) Sistemler: Bir yığın yoksa, arabelleği yeniden serbest bırakmak zorunda kalmazsanız. Bunlar genellikle mikro denetleyiciler üzerinde sahip olduğunuz kısıtlamalar. PC'lerde kendi uygulamanızı kullanmaktan kaçınmalısınız ve sadece malloc kullanın.

+0

Herhangi bir örnek alabilir miyim .ve onun uygulaması? –

1

Bu fonksiyon malloc benzer basit bir bellek ayırma arabirimini uygular. Bellek, allocbuf adı verilen sabit boyutlu bir diziden ayrılır. allocp işaretçisi, dizideki bir sonraki boş baytı işaret eder. Arandığında, isteği yerine getirmek için yeterli alan olup olmadığını kontrol eder. Ayrılan belleğin miktarı allocp - allocbuf'dur. Bunu toplam bellek miktarından çıkartarak, ALLOCSIZE, kalan miktarı verir. ALLOCSIZE - (allocp - allocbuf) Yani sadece ALLOCSIZE - allocp + allocbuf veya allocbuf + ALLOCSIZE - allocp. Bana göre, onu görüntülemenin en sezgisel yolu budur, ama aynı zamanda arabelleğin son boşluğu olarak arabellek içindeki ilk boş adres olarak düşünebilirsiniz. yeterli oda varsa Her durumda

, bu n ekleyerek allocp ayarlar, daha sonra yeni ayrılan bellek adresi olarak allocp özgün değerini verir. Aksi takdirde 0