2012-03-17 17 views
11

Linux platformu altında bir C++ programının yığın bellek boyutu nasıl bulunur? Yeni veya malloc kullanmadan önce yığın bellek alanı gerekir ve bundan sonra kimseye yardım edebilir miyim?nasıl kullanılır Bir programın yığın boyutu

#include <malloc.h> 
#include <iostream> 
int main() 
{ 

    //here need heap memory space 
    unsigned char* I2C_Read_Data= new unsigned char[250]; 
    //get heap memory space After the usage of new 
    return 0; 
} 
+2

yeni ve malloc aynı bölgeyi kullanmayın ... – UmNyobe

+2

@UmNyobe: Bu genellikle 'yeni' çağrıları genellikle :: malloc() ile gerçekleştirilir ... –

+0

http://stackoverflow.com/questions/1350819/c-free-store-vs-heap – UmNyobe

cevap

2

Sen getrlimit işlev çağrısını kullanabilir ve kaynak için RLIMIT_DATA geçmektedir. Bu, programınız için veri segmentinin boyutunu size vermelidir.

+0

Cevabınız için teşekkür ederiz, bana örnek bir kod verebilir misiniz? – Anu

+0

Basit bir arama, bu gibi bağlantılar vermiş olurdu - http://www.linuxquestions.org/questions/programming-9/getrlimit-is-setting-soft-and-hard-limits-to-1-why-160165/ – Gangadhar

+0

Merhaba, Bu, bellek alanını gösterir, ancak alan ayrıldıktan sonra değişmez. – Anu

5

Kullanım Valgrind en yığın profilci: Massif

+1

+1 diğer insanlar zaten sizin için yaptı ... – UmNyobe

+0

'arm-linux' platformunu kullanıyorum .... Bu platformda ne kadar valgündeler kullanılabilir? – Anu

4

Ayrıca new ve delete operatörleri aşırı yükleme yaparak kendi programlarına yığın izleme ekleyebilir. a game engine üzerinde çalışıyorum, her bir ayırmayı belirli bir yığın izleyici nesnesine bağlayan özel işlevlerden geçerek tüm bellek ayırma işlemlerine sahibim. Bu şekilde, herhangi bir anda, bir raporu alabilir ve varlıkların, aktörlerin, Lua betiklerinin vb. Tarafından ne kadar belleğe alındığını görebilirim.

Harici bir profiler kullanmanın (özellikle de kütüphaneler kendi bellek yönetimini idare ederler), ancak sizin sorumlu olduğunuz belleği tam olarak görmek çok güzel.

sample of my memory tables

0

dışında dış denetim dışında, ayrıca enstrüman malloc'un uygulamanız size bu istatistikleri incelemek izin edebilirsiniz. jemalloc ve tcmalloc, tipik libc uygulamalarının çok iş parçacıklı kod için daha iyi performans göstermesi üzerine, bu türden bazı yardımcı işlevler ekleyen uygulamalardır.

Daha derine inmek için, yığın ayırmanın nasıl çalıştığını biraz daha öğrenmelisiniz. Nihayetinde, OS, istedikleri gibi işlemlere bellek atayan bir sistemdir, ancak OS (syscalls) istekleri normal aramalardan daha yavaştır, bu nedenle genel olarak malloc'un bir uygulaması OS'ye büyük parçalar (4KB veya 8KB blokları) isteyecektir ortaktır) ve alt başlıklarını onları arayanlara sunmaya ayırır.

Sen süreç belirli bir prosedür çağrısı dahilinde OS istenen bellek, malloc tarafından kullanılıyor aslında hafızayı (kodun kendisini içerir) işlem tarafından tüketilen toplam bellekte ilgilenen olmadığını tespit etmek gerekir

Uygulama (kendi kitap tutma yükünü ekleyen, ancak küçük olan) veya numaralı numaralı telefonu talep ediyor.

Ayrıca, parçalanma son iki bir ağrı olabilir ve örneğin bir şekilde gerçekten kullanılan atanmış arasındaki farkları bulanıklaştırmaktadır.

2

Linux'ta bellek kullanım bilgilerini almak için /proc/[pid]/statm'u okuyabilirsiniz.

sayfalarında ölçülen bellek kullanımı hakkında bilgi sağlar. sütunlar şunlardır:

   size  total program size 
         (same as VmSize in /proc/[pid]/status) 
       resident resident set size 
         (same as VmRSS in /proc/[pid]/status) 
       share  shared pages (from shared mappings) 
       text  text (code) 
       lib  library (unused in Linux 2.6) 
       data  data + stack 
       dt   dirty pages (unused in Linux 2.6) 

fazla ayrıntı için man page bakınız. Bu question Adam Zalcman tarafından

Cevap

+0

Üniteler nelerdir? bayt? veya sayfalar? – weima

+0

Üniteler sayfalar. Bir sayfanın bayt cinsinden ne kadar büyük olduğunu bilmek için PAGE_SIZE getconf'unu kullanabilirsiniz. –

0

Sen "malloc_info" "mallinfo" deneyebilirsiniz yığın tahsisi bazı ilginç ayrıntılar açıklanır. Çalışabilirler. mallinfo, 2GB’dan daha fazla zaman ayırdığınız zaman sorunları var.malloc_info, belirli ve özellikle çok garip. Katılıyorum - çoğu zaman bu şeyleri üçüncü parti araçlar olmadan yapmak güzel.

İlgili konular