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?

63
05 дек. Nishant Kumar 05 Aralık tarafından ayarlanır . 2011-12-05 15:30 '11 15:30 2011-12-05 15:30
@ 9 cevap

Üç 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); 
63
05 дек. Cevap Constantinius 05 dec tarafından verildi . 2011-12-05 15:44 '11 15:44 2011-12-05 15:44

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):

border=0
 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:

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.

88
03 апр. Cevap brice 03 nisan. 2013-04-03 19:37 '13, 19:37 2013-04-03 19:37

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.

3
05 дек. cevap 05 Aralık vinay verilir . 2011-12-05 15:40 '11 15:40 2011-12-05 15:40

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.

2
05 дек. Cevap Rajeev Kumar 05 Dec. 2011-12-05 17:40 '11 5:40, 2011-12-05 17:40

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.

1
04 янв. Cevap ebenezer 04 jan tarafından verildi . 2013-01-04 10:58 '13, 10:58 2013-01-04 10:58

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); 
1
05 дек. cevap onemach 05 dec tarafından verilir . 2011-12-05 15:42 '11 15:42 2011-12-05 15:42

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.

0
18 апр. Cevap Ritu maheswari 18 Nisan tarafından verildi. 2017-04-18 11:31 '17, 11:31 2017-04-18 11:31

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.

-1
13 окт. Cevap 13 Ekim'de hanim tarafından verildi . 2015-10-13 13:46 '15 13:46 2015-10-13 13:46

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.

-2
28 дек. Bu sorunun cevabı user1934657 28 Dec. tarafından verilmiştir. 2012-12-28 17:12 '12, 17:12 2012-12-28 17:12