Speicherbedarf ermitteln



  • Hallo,

    wie kann ich den aktuellen Speicherverbrauch von dynamischen Variablen an beliebigen Zeitpunkten zur Laufzeit ermitteln?

    char* zk = "Hallo Welt !";
    Hier gibt mir die Funktion sizeof() immer nur den benötigten Speicher für den Zeigerwert aus... bei mir 4 Byte. Wie komme ich aber an den Speicherverbrauch von der Zeichenkette?

    Worum es mir aber hauptsächlich geht, ist der Speicherverbrauch von komplexen Objekten. beispielsweise Objekte, die Stringlisten enthalten. Gibts da nicht schon ne Funktion, die von einem Zeiger auf ein Objekt ausgehend den gesamten zugehörigen Speicher ermittelt? Wenn nicht, kann man sowas überhaupt selbst schreiben... also ne rekursive Funktion, die alle Zeiger ermittelt und analysiert. Das wird doch sicher schwierig, die verschiedenen möglichen Typen zu handlen (int, long, char, struct x usw.).

    pdm-steve



  • char* zk = "Hallo Welt !";
    

    Du schreibst in einen nicht allokierten Speicherbereich.
    Must du so machen.

    int main(int argc, char* argv[])
    {
       char zk[] = "Hallo Welt !";
       cout << sizeof(zk);
       return 0;
    }
    


  • pdm-steve schrieb:

    wie kann ich den aktuellen Speicherverbrauch von dynamischen Variablen an beliebigen Zeitpunkten zur Laufzeit ermitteln?

    Gar nicht (Genauer: Nicht mit Standard-Mitteln. Manche Compiler haben Funktionen für sowas.)

    Gibts da nicht schon ne Funktion, die von einem Zeiger auf ein Objekt ausgehend den gesamten zugehörigen Speicher ermittelt? Wenn nicht, kann man sowas überhaupt selbst schreiben... also ne rekursive Funktion, die alle Zeiger ermittelt und analysiert. Das wird doch sicher schwierig, die verschiedenen möglichen Typen zu handlen (int, long, char, struct x usw.).

    Sowas gibts nicht und sowas zu schreiben ist auch sehr viel Arbeit, ich wüsste jetzt nicht, wie man das automatisieren soll.

    BTW:

    char* zk = "Hallo Welt !";
    Hier gibt mir die Funktion sizeof() immer nur den benötigten Speicher für den Zeigerwert aus... bei mir 4 Byte. Wie komme ich aber an den Speicherverbrauch von der Zeichenkette?

    sizeof ist keine Funktion, sondern ein Operator, und "Hallo Welt !" ist kein dynamisches Objekt, sondern ein Stringliteral (demzufolge mit statischer Lebensdauer.)



  • x_y schrieb:

    char* zk = "Hallo Welt !";
    

    Du schreibst in einen nicht allokierten Speicherbereich.

    Unfug. Es wird nur die Adresse der Zeichenkette (statische Lebensdauer) in eine lokale Variable geschrieben.



  • @Bashar

    Es wird nur die Adresse der Zeichenkette (statische Lebensdauer) in eine lokale Variable geschrieben.

    So ein Blödsinn.



  • Was macht dich so sicher?



  • ... und wenn ich die Adresse einer Zeichenkette habe, kann ich nicht die länge der zeichenkette ermitteln? 😞



  • Ich kann es sehen. Orakelmäßig



  • strlen



  • Das würde so gehen:

    cout << "\"Hello world\" belegt " << sizeof("Hello world") << " Bytes";
    

    Reine Theorie, von Hand kann man sowas nicht schreiben 🙂 Etwas umständlich, aber halbwegs praktikabel:

    static const char text[] = "Hello world!";
    cout << '"' << text << "\" ist " << sizeof text << " Bytes groß.\n";
    

    Das sieht fast genauso aus wie die Lösung von x_y, allerdings liegt hier aufgrund der static-Speicherklasse der String nur einmal im Speicher. Bei x_y wird dieses Exemplar vorher auf den Stack (in das Array namens zk) kopiert.

    Dann gibts natürlich noch die Möglichkeit, das ganze zur Laufzeit mit strlen abzufragen, aber das willst du wahrscheinlich nicht.


Anmelden zum Antworten