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.
Im allgemeinen Fall nur für bestimmte Plattformen. Es hängt sehr stark mit der Implementierung des Heaps zusammen. –
Wen sollte shared_ptr <> zählen? – lorro
'std :: cout << sizeof (int) * v.kapacity() << endl;' – GreatAndPowerfulOz