2016-03-28 22 views
3

C++ 'da çalışan bir programın yığın boyutunu programsal olarak belirlemenin bir yolu olup olmadığını bilmek istiyorum. Öyleyse, programın çalışma zamanında ne kadar yığın bellek kullandığını programlamak için bir yol var mı? Yığının boyutunu belirlemek için, new ve delete operatörünü aşırı yükleyerek potansiyel bir yol görebiliyordum, ancak bunun akıllı göstergelerle çalışacağını düşünmüyorum. C++ Programında çalışma zamanında yığın boyutunun belirlenmesi

aşağıdaki ile bunu başarmak için çalıştı:

int main(){ 
    const char STACK_BEGIN = 'A'; 
    //a lot of code 
    register unsigned long int STACK_NOW asm("%esp"); 
    long long int stack_size = (reinterpret_cast<int>(&STACK_BEGIN) - STACK_NOW); 
    //rest of code 
} 
+0

Hayır, bunu yapmak için standart yöntemler gerçekten yok. Bu bilgiyi elde etmek için OS'ye özel sistem çağrıları olabilir. –

+0

Windows yığınında hatırladığım gibi sayfalar sadece gerektiği gibi işlenir. Bu, büyük bir yığının belirtilmesi maliyetinin, gerçek bellek kullanımı değil, yalnızca bir miktar azaltılmış adres alanı olduğu anlamına gelir (gerekene kadar). Yine de, arabelleklerini dinamik olarak ayıran std :: vector gibi standart koleksiyonları kullanarak yığın kullanımını önemli ölçüde azaltabilirsiniz. –

+4

Dünya çapında erişilebilir bir işaretçiyi, ana() rutininizdeki yığında bildirdiğiniz ilk değişkene ve daha sonra programınızın yürütülmesi sırasında herhangi bir zamanda depolayarak, en az yaklaşık yığın kullanımı fikrini alabileceğinizi düşünürdüm. Kısa süre önce bildirilen bir yığın değişkeninin adresi ile bu global işaretçinin değeri arasındaki farkı bulun. Bu ham bir tekniktir, ancak en az bir yığın kullanımı fikri sunmalıdır. – Logicrat

cevap

0

Yaklaşık şöyle çözülür:

int main(){ 
    const char STACK_BEGIN = 'A'; //a lot of code 
    register unsigned long int STACK_NOW asm("%esp"); 
    long long int stack_size = (reinterpret_cast<int>(&STACK_BEGIN) - STACK_NOW); //rest of code 
} 
+0

Yığında ikinci bir char bildirmek ve STACK_BEGIN ile yaptığınız gibi adresini almak yerine neden x86 asm kullanmanız gerektiğine dair bir fikriniz var mı? –

İlgili konular