2017-01-20 3 views
3

Ich fand, dass ich oft nur eine kleine std::map (sagen wir weniger als 10 Schlüssel), oder eine kleine std::vector mit nur ein paar Elementen, und ich denke, es ist wirklich eine Verschwendung von Leistung, sie immer dynamisch zuzuweisen, vor allem in Strukturen wie std::map<std::string, std::string>, std::vector<std::string>, da ist wirklich eine Menge dynamische Allokation beteiligt.Wie vermeidet man die dynamische Zuweisung kleiner Objekte?

Haben Sie einen guten Rat? Reduzieren Sie zumindest die Menge der dynamischen Zuweisung, besser ohne die Benutzerfreundlichkeit zu opfern. Dank

+1

Allgemeinen, wenn dies zu einem Engpass in Ihrem Code ist ein Ansatz ist es, einen [Speicherpool] zu schreiben oder verwenden (https : //stackoverflow.com/questions/16378306/c11-memory-pool-design-pattern). Sie reservieren im Wesentlichen eine Menge Speicher, und dann können Sie sie einfach wiederverwenden, ohne sie neu zuordnen zu müssen. – CoryKramer

+0

Wenn Sie mit einem flugkritischen sw arbeiten, können Sie während der Initialisierung immer Speicherplatz reservieren. Andernfalls, wenn Sie eine echte Leistung benötigen oder einen Engpass haben, müssten Sie einen benutzerdefinierten Speicherzuordner schreiben. – P0W

+2

Haben Sie tatsächlich die Kosten für solche Zuweisungen gemessen? Nur ein Code-Fragment als Engpass zu "denken", ist eine Anleitung zum Ändern des Codes. Also, bitte führen Sie zuerst einige Maßnahmen durch, um zu bestätigen, dass der Aufwand gewährleistet ist. – rpy

Antwort

4

können Sie Stapel -allocated Speicher für kleine Größe Daten (als Stapelzuordnungen sind sehr schnell, im Grunde nur eine Stapel-Pointer-Bewegung, obwohl Stack des Raum kostbar ist, und es ist eine sehr begrenzte Ressource), und Heap -allokierter Speicher für größer Größe. Mit anderen Worten, denken Sie an die Linien std::stringkleine String-Optimierung.

Um Zuweisungen zu beschleunigen, können Sie auch große Speicherblöcke im Heap vorbelegen und dann kleinere Zuordnungen innerhalb dieser Blöcke erstellen, wobei Sie im Grunde nur einen Zeiger innerhalb des Blocks erhöhen. Für eine Beispielimplementierung dieser Poolzuordner Technik, lesen Sie this blog post.

Sie werden diese CppCon 2016 Vortrag interessant und finden:

High Performance Code 201: Hybrid Data Structures

Verwandte Themen