2016-06-02 9 views
1

Es gibt eine einfache C++ KlasseMit sizeof für Klassen

class LASet 
{ 
    public: 
    long int maxValue, minValue; 
    int _count; 
    set <long int> _mySet; 
    LASet() 
    {   
     maxValue = 0; 
     _count = 0; 
     minValue =std::numeric_limits<long int>::max(); 
     _mySet.clear(); 
    } 
    void Add(long int value) 
    {        
     if (_mySet.find(value) != _mySet.end()) 
      return; 
     if (value > maxValue) 
      maxValue = value; 
     if (value < minValue) 
      minValue = value; 
     _mySet.insert(value); 
     _count++; 
    } 
    // some helper functions.... 
}; 

Als ich einige Objekte dieser Klasse instanziiert, ich will ihre Größe während der Laufzeit finden. Also, ich schrieb einfach die sizeof nach vielen Zyklen der Ausführung für jedes Objekt. Zum Beispiel:

LASet LBAStartSet; 
... 
... 
cout << "sizeof LBAStartSet = " << sizeof(LBAStartSet) << '\n'; 

Der cout Linie Berichte nur 72 für alle Objekte bedeuten, 72B, aber top Befehl zeigt 15GB Speicher.

Ich habe das Handbuch unter cppreference gelesen, dass sizeof bei einigen unvollständigen Datentypen nicht funktioniert. Ist mein Datentyp unvollständig?

Jede Rückmeldung wird geschätzt.

+2

'sizeof' tut nicht, was Sie denken, dass es tut ... lesen Sie diese Handbuchseite. Ihr Typ ist nicht unvollständig –

+0

Denken Sie daran, dass 'sizeof' zur Kompilierungszeit aufgelöst wird. –

+0

sizeof() ist ein Kompilierzeitoperator. Dein Typ ist vollständig. Wie ich aus deinem Code ersehen kannst, hast du "set" benutzt und wenn ich nicht falsch liege, fügst du zur Laufzeit Daten zu diesem Set hinzu. Sizeof() wird Ihre Größe nicht zur Laufzeit zurückgeben, sondern gibt die Größe Ihrer Klasse an, indem die Datenmembertypen zur Kompilierzeit berechnet werden. top zeigt Ihnen die tatsächliche Laufzeitspeicherauslastung (residenter Speicher). – sagar

Antwort

2

Da ich einige Objekte aus dieser Klasse instanziiere, möchte ich ihre Größen während der Laufzeit finden.

Sie scheinen davon auszugehen, dass sich die Größe eines Objekts zur Laufzeit ändern kann. Das ist nicht möglich. Die Größe eines Objekts ist zur Kompilierzeit gleich wie während der gesamten Laufzeit. Es ändert sich nie nach der Kompilierung.

Ist mein Datentyp unvollständig?

Nein. Wenn dies der Fall wäre, wäre Ihr Programm fehlerhaft und der Compiler würde wahrscheinlich die Kompilierung ablehnen. Ein Typ ist unvollständig, wenn er nur deklariert, aber nicht definiert ist. Sie haben LASet definiert, also ist es abgeschlossen.

Sie scheinen auch davon auszugehen, dass Elemente innerhalb std::set (ich nehme an, das ist, was Sie verwenden) erhöhen Sie die Größe des festgelegten Objekts. Sie nicht. Sie können nicht, weil die Größe immer bleibt und gleich bleiben muss. Stattdessen werden die Objekte außerhalb des Objekts im so genannten dynamischen Speicher gespeichert.

Also, der Speicher von Ihrem Programm verwendet wird, etwa:

sizeof LBAStartSet 
+ LBAStartSet._mySet.size() * (sizeof(long) + overhead_of_set_node + padding) 
+ overhead_of_dynamic_allocation 
+ static_objects 

Statische Objekte gehören Dinge wie std::cout. Der Aufwand für die dynamische Zuweisung hängt von der Implementierung ab, könnte aber O (n) in der Anzahl der dynamisch zugewiesenen Objekte sein.

Ich möchte das Wachstum der Datengröße während der Ausführung überwachen. Gibt es einen Weg, das zu finden?

Nicht in Standard-C++. Aber es gibt OS-spezifische Möglichkeiten.In Linux zum Beispiel gibt es das Pseudo-Dateisystem /proc und Sie könnten interessiert sein an Inhalt von /proc/self/status

0

Ich denke, das Problem ist in der Mitglied _myset. Es ist ein Objekt und die Größe von (LASet) erhöht sich nicht, wenn Sie Werte in _myset einfügen. Es ist wahrscheinlich, dass sizeof (LAset) zur Kompilierzeit ausgewertet wird.

Sie könnten mit set :: size herausfinden, wie viele Elemente in einem Satz enthalten sind. Wenn Sie dies für alle Instanzen von LASet tun, könnten Sie eine grobe Annäherung an den benötigten Speicher erhalten.