2016-07-07 28 views
0

Wie kann ich in einem laufenden Programm die Größe des Heapspeichers verfolgen/drucken, den ein Objekt zugewiesen hat?Gibt es eine Möglichkeit, die Menge an Heapspeicher zu drucken, die ein Objekt zugewiesen hat?

Zum Beispiel:

#include <iostream> 
#include <vector> 

int main(){ 

    std::vector<int> v; 

    std::cout << heap_sizeof(v) << '\n'; 

    for (int i = 0; i < 1000; ++i){ 
    v.push_back(0); 
    } 

    std::cout << heap_sizeof(v) << '\n'; 
} 

Gibt es eine Implementierung, die heap_sizeof() ersetzen könnte?

+0

Im allgemeinen Fall nur für bestimmte Plattformen. Es hängt sehr stark mit der Implementierung des Heaps zusammen. –

+0

Wen sollte shared_ptr <> zählen? – lorro

+0

'std :: cout << sizeof (int) * v.kapacity() << endl;' – GreatAndPowerfulOz

Antwort

1

mit allem, was, wie es aus der Box entworfen ist, nein, das ist nicht möglich. Sie haben jedoch ein paar Möglichkeiten, das alleine zu tun.

Wenn Sie dies ausschließlich für Standardcontainer benötigen, können Sie einen Zuordner implementieren, der den Speicher verfolgt, der über diesen Zuordner zugewiesen (und nicht freigegeben) wurde.

Wenn Sie diese Fähigkeit für alles über new zugeteilt (ob ein Container oder nicht) möchten, können Sie eine eigene Implementierung von operator new auf einer globalen und/oder klassenspezifischen Basis bereitstellen, und haben Sie (zum Beispiel) erstellen Sie eine ungeordnete Zuordnen von Zeigern zu Blockgrößen, um die Größe eines zugewiesenen Blocks anzugeben (und damit müssen Sie eine Funktion zum Abrufen dieser Größe bereitstellen). Je nach Plattform kann dies auch mit plattformspezifischen Funktionen realisiert werden. Zum Beispiel, wenn Sie für den Compiler von Microsoft (naja, Bibliothek, wirklich) bauen, würde Ihre Implementierung von operator new nichts besonderes zu tun haben, und die Funktion zum Abrufen einer Blockgröße würde etwa so aussehen:

Eine weitere Möglichkeit wäre, die Zuordnungsgröße jedes angeforderten Blocks um die Größe einer ganzen Zahl zu erhöhen, die groß genug ist, um die Größe zu halten. In diesem Fall würden Sie einen größeren Datenblock zuordnen, als der Benutzer angefordert hat, und die Größe dieses Blocks am Anfang des Blocks speichern, der zurückgegeben wurde. Wenn der Benutzer die Größe eines Blocks anfordert, nehmen Sie den korrekten (negativen) Offset von dem übergebenen Zeiger und geben den Wert zurück, den Sie dort gespeichert haben.

1

Zuerst wird v auf dem Stapel zugewiesen, nicht auf dem Heap.

Um die Gesamtmenge der Raum, der von früher zu erhalten, empfehlen ich mit dieser Funktion: (Gefundene on this article und modifiziert, um ein Bit)

template <typename T> 
size_t areaof (const vector<T>& x) 
{ 
    return sizeof (vector<T>) + x.capacity() * sizeof (T); 
} 

Wenn Sie die Größe des std::vector Objekt nicht zählen wollen selbst , der den Teil mit sizeof löschen:

template <typename T> 
size_t heap_sizeof (const vector<T>& x) 
{ 
    return x.capacity() * sizeof (T); 
} 
+2

'v' kann auf dem Stapel sein, aber es ist Inhalt auf dem Haufen. – GreatAndPowerfulOz

+0

Ja natürlich. Ich wollte nur darauf hinweisen, dass v auf dem Stapel ist (in seinem Beispiel). –

+0

Ok. Erwischt. Abgeklärt. – GreatAndPowerfulOz

0

Wenn Sie sich nicht darum kümmern, was jedes Objekt zuweist und sich mehr darum kümmert, wie viel Speicher zwischen dem Zeitpunkt zugewiesen wurde, können Sie die malloc-Statistikfunktionen verwenden. Jeder Malloc hat eine eigene Version. Unter Linux können Sie mallocinfo() verwenden.