2013-06-26 30 views
9

Bellek ayırma ile ilgili bir sorum var. Bunun gibi bir dizi işaretçi yarattığımı varsayalım.C++ bir dizi işaretçi için bellek ayırma

int **numbers = new int *[1024*1024]; 

Bu (Mac 64-bit 8 bayt işaretçisi) bellek 8MB ihtiyaç düşünmekteydiler ama bu böyle değil. Hafıza sadece her bir işaretçi bir değer atandığında tahsis edilir. Yani tüm işaretçiler NULL ise, 8MB ayrıldığını görüyorum.

for(int i=0; i<1024*1024; i++) 
{ 
    numbers[i] = NULL; 
} 

Uygulamam, hangi tanıtıcıya bunun için bellek ayırmadan atanmış bir değere sahip olduğunu nasıl biliyor?

+9

"Yeni" muhtemelen yalnızca adres alanını ayırıyor ve yalnızca bellek yazıldıktan sonra bellek işliyor. Bu yaygın bir optimizasyon ve işletim sistemi tarafından gerçekleştirilir. – Mankarse

+0

Sadece karışıklık eklemek için, eğer okumak yerine, yazmak yerine, tüm işaretçiler, hepsi NULL olurdu, ama bu durumda belleğiniz yükselmeyecek, çünkü sadece sıfır sayfasını okuyor olacaksınız. ve tekrar tekrar. – Neil

cevap

5

overcommit-accounting adı verilen işletim sisteminin bir özelliğini gözlemliyorsunuz.

Atanmamış bellek, varsayılan olarak yalnızca adres alanını (işleme özgü sanal bellek) alır. Yalnızca değerleri atarken, sayfalar aslında sayfa tablosundaki fiziksel adreslerle eşlenir.

2

Tahminim belleğe ayrılmıştır, ancak ps/top sonucunda [sayfaların hangi macda bulunmadığından emin değil] sayfalara dokunulmadığından emin olun. tüm bellekle ilgili sütunları chk

12

C++ perspektifinden belleğinize ve oradan ayrılır. İşletim sisteminin bildirdiği şey ile kafanızı karıştırmazsınız.

"Uygulamanız" kesinlikle bir işaretçi atanıp atanmadığını bilmez - sadece programlayıcı atamadan önce hangi göstericiyi kullanmamasından sorumludur.

Muhtemel backgroung merak ediyorsanız, burada veya diğer makalelerde olduğu gibi memory overcommit için etrafa bakın.

İlgili konular