2011-01-14 4 views
0

Ich habe eine ganze Reihe von Objekten eines bestimmten Typs, von denen jeder eine Deque zuweisen kann, um andere Objekte desselben Typs zu halten. Ich benutze eine Deque, weil ich an beiden Enden schnellen Zugriff benötige, und weil irgendein bestimmtes Objekt sich möglicherweise auf viele andere Objekte beziehen kann.So etwas wie eine große Anzahl von Objekten, aber kleine Speicherauslastung bei kleinen Zahlen?

Es ist jedoch wahrscheinlich, dass viele oder sogar die meisten Objekte sich auf sehr wenige andere Objekte beziehen. In diesem Fall ist die Speichernutzung von Deque ziemlich groß. Die Implementierung, die ich verwende, teilt 4096 Bytes bei einer Aufnahme zu, sobald ich die allererste push_back() mache. Jedes Element in der Deque ist nur 8 Bytes. Das ist viel verschwendeter Raum, vor allem, weil ich viele dieser Objekte und damit viele dieser Objekte baue.

Gleichzeitig brauche ich ziemlich genau eine Deque (oder so ähnlich), denn wie gesagt, jedes einzelne Objekt kann sich auf viele andere Objekte beziehen, obwohl die meisten Objekte sich auf sehr wenige Objekte beziehen .

Mein erster Gedanke war die Verwendung von capacity() und reserve(), um die Deque selbst wachsen zu lassen, aber mein Compiler informierte mich, dass es solche Funktionen auf Deque nicht gibt.

Also dachte ich mir vielleicht, um eine Klasse mit einer Deque-ähnlichen Schnittstelle zu schreiben, darunter ein Vektor und eine Deque, mit dem Vektor verwendet, bis (sagen wir) sechzehn Elemente existieren, nach denen der Vektor weggeworfen und Die Deque wird von da an benutzt.

Da der Vektor nur verwendet wird, wenn es nur eine kleine Anzahl von Elementen gibt, sollte es nicht wirklich wichtig sein, dass push_front() und pop_front() ineffizient sein werden, und ich kann Steuern Sie den Vektor mit Kapazität() und Reserve(), es sollte nicht wirklich wichtig sein, dass Deque viel Speicher verwendet, wenn mehr Elemente vorhanden sind.

Aber bevor ich meine eigene Klasse wie diese aufbaute, wollte ich überprüfen, ob so etwas schon existiert. Wenn irgendjemand aus irgendeinem Grund weiß, dass ich nicht darüber nachgedacht habe, warum so etwas eine schlechte Idee ist, oder wenn jemand ähnliche Vorschläge hat, würde ich es gerne hören.

Vielen Dank im Voraus.

+0

Tatsächlich hat 'std :: deque' keine' capacity() 'oder' reserve() ', da es seine Elemente nicht in einem großen Block speichert. –

+0

@Tomalak: Ich wünschte, es wäre aber, und ich verstehe nicht, warum es nicht sollte. Nicht aus diesem Grund, nur weil Sie, wenn Sie Platz reservieren könnten, einen Beweis für einen Speicherzuweisungsfehler für die nächsten Einfügungen liefern würden, vorausgesetzt natürlich, dass ein nicht zuweisender Kopierkonstruktor für den Wertetyp existiert. Das Gleiche gilt für alle anderen Standardsammlungen, und es ist mehr oder weniger schwierig zu sehen, wie dies für verschiedene Container implementiert werden würde. Also ich denke, eine Zeile wurde bei 'vector' gezeichnet. –

+0

@SteveJessop: Ja, ich bin nicht wirklich sicher, was die Begründung ist TBH.Ich nehme an, es ist, weil 'std :: deque' so viel" cleverer "ist, mit seinen Speicherbausteinen wurde beschlossen, den Container einfach alles selbst machen zu lassen .... wohingegen' std :: vector' mehr "manuell" ist . –

Antwort

2

Sie erwähnen nicht, wenn Sie andere Fähigkeiten von vector oder deque wie Random-Access-Iteratoren benötigen. Wenn Sie das nicht tun, klingt das tatsächlich wie ein guter Kandidat, list zu verwenden. Es hat eine gute Leistung Einfügen und Entfernen von beiden Enden.

2

Sie können eine (aufdringliche) Liste verwenden, wenn Sie keinen wahlfreien Zugriff nach Index benötigen. Listen erlauben schnelle O (1) push_front/push_back() und pop_front/pop_back().

Wenn Objekte nicht geteilt werden, das heißt, ein Objekt wird immer nur von höchstens einem anderen Objekt gehört, dann wäre eine störende Liste die beste. Und da Ihre Objekte vom gleichen Typ sind, können sie aus einem Speicherpool (großes Array) zugewiesen werden, um jeglichen Speicheraufwand zu vermeiden.

Verwandte Themen