2016-04-03 6 views
0

Ich habe gerade mit einer Bibliothek gearbeitet, die potenziell schwere Objekte erstellt. Insbesondere erstelle ich Objekte, die mit Wave-Dateien verknüpft sind.So erkennen Sie, ob ein Objekt hauptsächlich aus Stack- oder dynamischem Speicher besteht

Wenn nun eine Instanz eines Wave-Objekts (nur als Beispiel) erstellt wird, gibt es eine gute Möglichkeit, zu bestimmen, wo es im Speicher zugewiesen wird?

Zum Beispiel, wenn ich einen std :: Vektor in den Stapel instanziieren soll, weiß ich, dass etwas Speicher auf dem Stapel zugeordnet ist (d. H. Headerinformationen) und die tatsächlichen Containerdaten auf dem Heap erstellt werden. So muss ich mir zum größten Teil keine Gedanken über einen Stapelspeicherüberlauf machen. Obwohl ich immer noch die Möglichkeit habe, das Objekt in Heap vollständig zu instanziieren.

Aber sagen wir, ich weiß nicht über eine Objekte Implementierung. Nehmen wir an, ich verwende eine Bibliothek, die ein riesiges Array im Stack erstellt. Dies könnte möglicherweise Probleme verursachen.

Also meine Frage: Woher wissen wir, wie "schwer" ein Objekt ist Speicher-weise?

+0

Die kurze Antwort ist: Sie können nicht. Zumindest nicht, wenn Sie ein Factory Parttern verwenden, das Ihre Objekte immer auf dem Heap instanziiert. In diesem Fall ist die Antwort natürlich immer "der Haufen". –

Antwort

3

Ich gehe davon aus, dass extra-Standard-Methoden zur Zuweisung von Stack-Speicher von der Tabelle sind (alloca und Freunde).

Da ist es einfach: Nehmen Sie das Objekt sizeof.

C++ ist eine statisch typisierte Sprache, aber ihre Objekte sind auch statisch Größe. Jeder Typ hat eine Größe, die zur Kompilierzeit bestimmbar sein muss. Viele C++ verlässt sich darauf. Wenn Sie sich also Sorgen darüber machen, dass ein Objekt zu viel Speicherplatz belegt, könnte das nur daran liegen, dass das Objekt diesen Platz einnimmt.

Beachten Sie, dass dies nicht verhindern, Probleme, wenn Sie eine Funktion aufrufen, die selbst viel Stapelspeicher verwendet. Sie können nichts dagegen tun. Aber Sie können feststellen, ob die Größe eines bestimmten Objekts durch eine beliebige Messung "groß" ist oder nicht.

+0

Ich verstehe. Aus irgendeinem Grund dachte ich, dass Sie ein Objekt mit einem Member std :: array haben könnten, dessen Größe je nach Aufruf des Objektkonstruktors variieren könnte ... Aber die Größe des Arrays müsste festgelegt sein und nicht variieren. – Izzo

Verwandte Themen