2017-03-16 1 views
0

Ich habe eine Anwendung in C++, für die ich grundlegende Speicherprofilierungsfunktionen implementieren möchte.Programmieren einer grundlegenden speicherinternen Profilerstellung: Zählen von erstellten Zeigern?

Für die wichtigsten und speicherintensivsten Klassen, habe ich in den Konstruktoren, Kopierkonstruktoren und Destruktoren, einige Code, der berechnet und speichert die Menge an Speicher von jeder Instanz der Klasse verwendet (der Code läuft nur, wenn ein Makro # MEMPROFILE definiert Etwas wie:.

class MyClass 
{ 
    MyClass(){ 
     #ifdef MEMPROFILE 
     calcAndSaveMemUsage(); 
     #endif 
    } 
... 
} 

Analog der destructor die Zähler entsprechend aktualisiert, die Art und Weise, wann immer das Makro für die Profilerstellung definiert und eine neue Instanz wird wie MyClass obj, Speicherverbrauch info erstellt wird, automatisch verarbeitet

..

Gibt es Möglichkeiten zu autom Machen Sie eine ähnliche Sache wie Zeiger - entweder im Allgemeinen oder die Zeiger dieser bestimmten Klasse? Zum Beispiel, um einen Zähler jedes Mal automatisch zu erhöhen, wenn ein Zeiger erstellt wird?

Ich wäre daran interessiert, mehr über alle Möglichkeiten zu lernen, sei es mit Überladung, Verpackung oder Instrumentierung.

PS: Ich kenne externe Tools, die mir Profilspeicher helfen würde. Ich interessiere mich für das Lernen der oben genannten Sache.

+0

Wie überladen Sie die 'neuen' und' neuen [] 'Operatoren? –

+0

Vielleicht nicht, was Sie suchen, aber Sie könnten 'std :: shared_ptr' verwenden und dann seine' use_count() 'Methode – aguadoe

Antwort

1

Nein, das ist nicht möglich. Zeiger sind keine benutzerdefinierten Typen. Sie können auch von memcpy kopiert werden, was bedeutet, dass der Compiler vielleicht nicht einmal weiß, dass er sie kopiert. Hinter den Kulissen, std::copy kann auch memcpy wo möglich, so ist es nicht nur explizite Anrufe an memcpy, die Sie stolpern würde.

+0

In diesem Fall, was ist mit einem anderen Ansatz: anstatt Klassen oder Objekte zu umhüllen, was über überschreiben 'memcpy',' malloc' und oder mit dem, was anscheinend [allocation hook functions] genannt wird (https://msdn.microsoft.com/en-us/library/cy8c7wz5.aspx?f=255&MSPPError=-2147217396)? – Louis15

+0

@ Louis15: 'memcpy' kopiert Bytes. Ob diese Bytes 0, 1 oder mehr Zeiger enthalten, kann nicht zuverlässig bestimmt werden. Wie zum Erstellen von Zeigern, der einfachste Weg, wenn Sie '& Objekt' schreiben und das überhaupt keine Funktion beinhaltet. – MSalters