Statik hafıza ayırma ve dinamik hafıza ayırma arasındaki fark
Statik bellek ayırma ve dinamik hafıza ayırma arasındaki farkın ne olduğunu bilmek isterim?
Bunu herhangi bir örnekle açıklayabilir misiniz?
Üç tür yerleşim vardır - statik, otomatik ve dinamik.
Statik yerleştirme , değişkenler için belleğin program başladığında tahsis edildiği anlamına gelir. Program oluştururken boyut sabittir. Genel değişkenler, dosya kapsamı değişkenleri ve içinde tanımlanmış
static işlevlere karşılık gelen değişkenler için geçerlidir.
Otomatik bellek tahsisi , işlevler içinde tanımlanan (statik olmayan) değişkenler için gerçekleşir ve genellikle yığında depolanır (standart C bir yığının kullanılmasını sağlamaz). Bunları kullanarak ek hafıza ayırmanıza gerek yoktur, ancak diğer yandan, bu hafızanın kullanım ömrü üzerinde kontrol de sınırlıdır. Örneğin: işlevdeki otomatik değişkenler yalnızca işlevin sonuna kadar bulunur.
void func() { int i; }
Dinamik bellek ayırma biraz farklı. Şimdi bu bellek konumlarının tam boyutunu ve ömrünü siz belirlersiniz. Serbest bırakmazsanız, uygulamanızın başarısız olmasına neden olabilecek bellek sızıntılarıyla karşılaşırsınız, çünkü bir noktada sistem daha fazla bellek ayıramaz.
int* func() { int* mem = malloc(1024); return mem; } int* mem = func();
Yukarıdaki örnekte, fonksiyonun eksiksiz olmasına rağmen, ayrılmış hafıza hala geçerlidir ve kullanılabilir durumdadır. Belleği tamamladığınızda, serbest bırakmalısınız:
free(mem);
Bu standart bir röportaj sorusu:
Dinamik bellek ayırma
Çalışma zamanında
calloc() ,
malloc() ve friends kullanarak hafıza tahsis edilir. Ayrıca yığın veri yapısı ile bir ilgisi olmasa da, bazen yığın bellek olarak da adlandırılır.
int * a = malloc(sizeof(int));
Öbek belleği,
free() olarak adlandırılana kadar devam eder. Başka bir deyişle, bir değişkenin ömrünü kontrol edersiniz.
Otomatik hafıza ayırma
Bu genellikle hafızanın “yığını” olarak bilinir ve yeni bir alana girildiğinde tahsis edilir (genellikle çağrı yığınına yeni bir fonksiyon yerleştirildiğinde). Kapsam dışına çıktığınızda, otomatik bellek adreslerinin değerleri tanımlanmaz ve bunlara bir hata giderilir.
int a = 43;
Bir bölgenin mutlaka bir işlev anlamına gelmediğine dikkat edin. Alanlar bir işleve girebilir ve değişken yalnızca içinde bildirildiği satır içinde yer alır. Ayrıca, ayrılmış hafıza belirtilmemişse unutmayın. (Makul bir sistemde, optimizasyon için yığında veya kayıtlarda olacak)
Statik bellek tahsisi
Derleme zamanında dağıtılır ve statik bellekteki bir değişkenin ömrü programın ömrüdür .
C'de,
static kullanılarak statik bellek tahsis edilebilir. Kapsam bir derleme birimidir.
extern anahtar sözcüğü
extern her şey daha ilginç hale gelir. Bir
extern değişken tanımlandığında, derleyici bunun için bellek ayırır. Bir
extern değişken bildirildiğinde, derleyici değişkenin başka bir yerde tanımlanmasını gerektirir.
extern değişkenleri bildirmemek / tanımlamak başarısızlık ciltleme ile ilgili sorunlara neden olurken,
static değişkenleri bildirmek / tanımlamak derlemeyle ilgili sorunlara neden olur.
Dosya bölmesinde statik anahtar sözcük isteğe bağlıdır (işlevin dışında):
int a = 32;
Ancak işlev alanında değil (işlev içinde):
static int a = 32;
Teknik olarak,
extern ve
static , C'deki iki ayrı değişken sınıfıdır.
extern int a; int a;
Kayıt hafızası
Son bellek sınıfı "register" değişkenidir. Beklendiği gibi, kayıt değişkenleri CPU kaydında tahsis edilmelidir, ancak karar aslında derleyiciye bırakılır. Bir kayıt değişkenini bir adres kullanarak bir bağlantıya çeviremezsiniz.
register int meaning = 42; printf("%p\n",
Modern derleyicilerin çoğu, hangi değişkenlerin sicillere yerleştirilmesi gerektiğine karar verdiğinizden daha zeki :)
tavsiyeler:
- Libc kılavuzu
- K R Programlama Dili C , Ek A, Bölüm 4.1, Depolama Sınıfı. ( Pdf )
- C11 Bölüm 5.1.2, 126.96.36.199
- Wikipedia'da ayrıca statik bellek ayırma, dinamik bellek ayırma ve otomatik bellek ayırma hakkında iyi sayfalar var .
- Wikipedia'da Öbek C Tahsis Sayfası
- Bu bellek yönetimi kılavuzu , dinamik ayırıcıların temel uygulamaları hakkında daha ayrıntılı bilgi içerir.
Statik bellek tahsisi ile ilgili notlar
Statik hafızanın derleme zamanında tahsis edildiğini söylemek biraz kafa karıştırıcıdır, özellikle derleme makinesinin ve ana makinenin aynı veya hatta aynı mimaride olabileceğine inanmaya başlarsak.
Statik belleğin dağılımının derleyici tarafından ele alındığını ve derleme zamanında tahsis edilmediğini düşünmek daha iyi olabilir. Örneğin, derleyici derlenmiş ikili dosyada büyük bir
data bölümü oluşturabilir ve program belleğe yüklendiğinde, programın
data bölümündeki adres tahsis edilen belleğin konumu olarak kullanılır. Bu, derlenmiş ikili dosyanın çok fazla statik bellek kullanması durumunda çok büyük olmasının belirgin bir dezavantajına sahiptir. Yarım düzine kod satırından oluşturulan birkaç gigabayt içeren bir ikili dosya yazmak mümkündür. Diğer bir seçenek, derleyicinin, program yürütülmeden önce başka bir şekilde bellek tahsis edecek başlatma kodunu girmesidir. Bu kod, hedef platforma ve işletim sistemine bağlı olarak değişecektir. Uygulamada, modern derleyiciler bu seçeneklerden hangisinin kullanılacağına karar vermek için buluşsal yöntemleri kullanır. 10k, 1m, 10m, 100m, 1G veya 10G elementlerin büyük statik dizisini vurgulayan küçük bir C programı yazarak kendiniz deneyebilirsiniz. Pek çok derleyici için, bir ikili dosyanın boyutu, dizinin boyutuyla doğrusal olarak büyüyecek ve belirli bir noktadan geçecektir, derleyici farklı bir dağıtım stratejisi kullandığında, yeniden küçülecektir.
Dinamik bellek ayırma - bellek, çalışma zamanında öbek üzerinde tahsis edilir. Bellek miktarı (boyutu) değişken olduğunda ve yalnızca çalışma zamanında biliniyorsa kullanılır. Dinamik dağılım, malloc (), calloc (), realloc (), C'de ücretsiz ve C ++ 'da "new", "delete" gibi bazı fonksiyonlar kullanılarak elde edilir.
Statik hafıza ayırma - yığında veya diğer veri segmentlerinde derleme zamanında tahsis edilen hafıza. Bu, bellek miktarı (boyut) statik / sabit olduğunda ve derleme zamanında bilindiğinde kullanılır.
Statik Bellek Ayırma: Derleyici, bildirilen değişken için gerekli bellek alanını ayırır. Operatörün adresini kullanarak, ayrılmış adres elde edilir ve bu adres bir işaretçi değişkenine atanabilir. Bildirilen değişkenin çoğunun statik belleği olduğundan, işaretçi değerini işaretçi değişkenine atamanın bu yöntemi statik bellek ayırma olarak bilinir. derleme zamanında hafıza atanır.
Dinamik bellek ayırma: Dinamik olarak bellek almak için malloc () veya calloc () gibi işlevleri kullanır. Bu işlevler dinamik olarak bellek elde etmek için kullanılıyorsa ve bu işlevlerin döndürdüğü değerler ise, işaretçi değişkenleri, bu tür atamalar dinamik bellek ayırmaları olarak adlandırılır. Hafıza çalışma zamanında belirlenir.
STATİK HAFIZA DAĞILIMI VE DİNAMİK HAFIZA DAĞILIMI ARASINDAKİ FARK
Program çalıştırılmadan önce hafıza tahsis edilir (derleme zamanında).
Program yürütme sırasında hafıza ayrılır.
Çalışma zamanında, hiçbir bellek ayırma veya boşaltma işlemi gerçekleştirilmez.
Bellek ciltleri çalışma zamanında ayarlanmış ve yok edilmiştir.
Değişkenler sürekli seçili kalır.
Sadece aktif program bloğu ile seçilir.
Yığınlar ve yığınlar kullanılarak uygulanır.
Veri segmentleri kullanılarak uygulanır.
Değişkenlere erişmek için işaretçi gerekli.
Dinamik olarak tahsis edilmiş işaretçilere gerek yok.
Dinamikten daha hızlı yürütme.
Statikten daha yavaş yürütme.
Ek hafıza gerekli. Daha az hafıza gerektirir.
Statik belleğin yerleştirilmesi. Ayrılan hafıza yığında olacaktır.
int a[10];
Dinamik bellek ayırma. Ayrılan hafıza bir yığın halinde olacaktır.
int *a = malloc(sizeof(int) * 10);
ve sonuncusu serbest olmalıdır, çünkü C'de çöp toplayıcı yoktur (GC).
free(a);
Statik bellek ayırma, pf programını derleme zamanında çalıştırmadan önce belleği ayırır. Dinamik bellek ayırma, çalışma zamanında programın yürütülmesi sırasında bellek tahsis edilir.
Statik bellek: Statik depolama aygıtları, bellekteki verilerin üzerine düzenli aralıklarla yazmak veya güncellemek zorunda kalmadan güç uygulanıncaya kadar depolanan verilerin kalıcı olarak saklanacağı yarı iletken depolama aygıtlarıdır. Bu kasanın ana unsuru flip-flop veya gate. SRAM, delikli kartlar ve teyp statik bellek örnekleridir.
Statik hafıza: Statik hafıza cihazları, hafızada bulunan verilerin üzerine periyodik olarak yazmaya veya güncellemeye gerek kalmadan güç uygulanıncaya kadar saklanan verilerin kalıcı olarak saklanacağı yarı iletken hafıza cihazlarıdır. Bu kasanın ana unsuru flip-flop veya gate. SRAM, delikli kartlar ve teyp statik bellek örnekleridir.
Dinamik Bellek :. Dinamik depolama aygıtları, verinin belleğe periyodik olarak üzerine yazılmadığı sürece, enerji verilmiş olsalar bile, depolanan verilerin kalıcı olarak kaydedilmeyeceği yarı iletken depolama aygıtlarıdır. Veriler kapasitörlerde şarj olarak saklanır. Sızıntıyı önlemek için kondansatör üzerindeki şarj periyodik olarak güncellenmelidir. DRAM ve şarj bağlı cihaz (CCD), dinamik belleğin örnekleridir.