2016-03-28 10 views
3

Ich würde gerne wissen, ob es eine Möglichkeit gibt, die Stapelgröße eines laufenden Programms in C++ programmgesteuert zu bestimmen. Wenn ja, gibt es auch eine Möglichkeit, programmatisch zu ermitteln, wie viel Heapspeicher das Programm zur Laufzeit verwendet? Zum Bestimmen der Größe des Heapspeichers konnte ich einen möglichen Weg sehen, indem ich den Operator new und delete überbelastete, aber ich denke nicht, dass dies mit intelligenten Zeigern funktionieren würde.Ermitteln der Stapelgröße zur Laufzeit in einem C++ - Programm

Ich versuchte es mit dem folgendes zu erreichen:

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

Nein, es gibt nicht wirklich Standard-Methoden, dies zu tun. Es kann jedoch betriebssystemspezifische Systemaufrufe geben, um diese Informationen zu erhalten. –

+0

Wie ich mich erinnere in Windows Stack-Seiten werden nur nach Bedarf festgelegt. Das bedeutet, dass die Kosten für das Angeben eines großen Stapels nur ein wenig reduzierter Adressraum sind und nicht die tatsächliche Speicherbelegung (bis zum erforderlichen Zeitpunkt). Durch die Verwendung von Standardsammlungen wie 'std :: vector', die ihre Puffer dynamisch zuweisen, können Sie die Stack-Nutzung erheblich reduzieren. –

+4

Ich denke, Sie könnten zumindest eine ungefähre Vorstellung von der Stack-Nutzung bekommen, indem Sie einen global zugänglichen Zeiger auf die erste Variable speichern, die Sie auf dem Stack in Ihrer 'main()' Routine deklarieren, und dann jederzeit während der Ausführung Ihres Programms , finde den Unterschied zwischen der Adresse einer kürzlich deklarierten Stapelvariablen und dem Wert dieses globalen Zeigers. Es ist eine grobe Technik, sollte aber zumindest eine Vorstellung von Stack-Nutzung bieten. – Logicrat

Antwort

0

ich es so ungefähr gelöst:

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

Irgendeine Idee, warum Sie x86 Asm verwenden müssen, anstatt ein zweites Zeichen auf dem Stapel zu deklarieren und seine Adresse genau wie bei STACK_BEGIN zu nehmen? –