C++ C++ deque und vector RAM Verbrauch

T_55

Lieutenant
Registriert
Feb. 2013
Beiträge
638
Hallo,

wieso verbraucht ein eingebettetes deque, 7x soviel RAM als ein vector?
Es ist an dieser Stelle sozusagen nur die Indexanzahl der erste Dimension definiert aber noch keinerlei Werte vorhanden warum ist soviel Speicherbedarf bei deque?

std::vector<std::vector<double>> var; var.resize(10000); // RAM -> 1.084 K

std::deque<std::deque<double>> var; var.resize(10000); // RAM -> 7.196 K

std::vector<std::deque<double>> var; var.resize(10000); // RAM -> 7.060 K

std::deque<std::vector<double>> var; var.resize(10000); // RAM -> 1.096 K

Gruß
 
Woher kommen deine Zahlen? Wenn das der Gesamtspeicherverbruch des Programms ist, sagt das nicht viel aus, da spielt der Speicherallokator vom OS gewaltig mit rein.

Es ist an dieser Stelle sozusagen nur die Indexanzahl der erste Dimension definiert aber noch keinerlei Werte vorhanden
Du erstellst mit dem resize-Aufruf quasi 10000 leere Vector- und Deque-Objekte. Das erklärt dann auch, warum sich der Speicherverbrauch überhaupt unterscheidet:

Code:
  std::cout << sizeof(std::vector<double>) << std::endl;  // 24
  std::cout << sizeof(std::deque <double>) << std::endl;  // 80

Eigentlich würde ich vermuten, dass dein deque<deque<double>>-Konstrukt mit Abstand am meisten Speicher braucht, da a) die inneren Deques selbst sehr groß sind und b) bei der äußeren Deque dynamische Allokation verwendet wird (zwar in aller Regel mit Hilfe optimierter Allokatoren, Overhead gegenüber einem Array wie dem Vector entsteht aber immer)
 
Zuletzt bearbeitet:
Ja richtig das war der Gesamtspeicherverbrauch. Mit Erstellung noch größerer Objekte kommt sogar zutage dass das eingebettete deque sogar zu einem 50-Fach größerem Gesamtspeicherverbrauch als vector führt.

std::vector<std::vector<double>> var; var.resize(1000000); // RAM -> 12.140 K
std::deque<std::deque<double>> var; var.resize(1000000); // RAM -> 621.276 K
std::vector<std::deque<double>> var; var.resize(1000000); // RAM -> 618.996 K
std::deque<std::vector<double>> var; var.resize(1000000); // RAM -> 12.800 K

Bei sizeof ist der Unterschied zwar nicht so gewaltig aber gut zu erkennen das deque mehr braucht, danke für das Beispiel.
 
Zurück
Oben