Hier habe ich einen einfachen multi_index Container und ich frage mich, ob es eine Möglichkeit ist, die multi_index zwingen die Elemente aneinander angrenzend in Speicher zuzuweisen. Ich dachte, das wäre möglich, wenn der Hauptindex random_access
ist.Ist es möglich, multi_index Container zusammenhängende Speicher verwenden?
jedoch Dieses einfache Beispiel zeigt, dass überraschenderweise die Elemente im Speicher nicht zusammenhängend sind. Gibt es eine Kombination aus boost::multi_index::indexed_by
, die wahrscheinlich in zusammenhängenden Speicher führen würde?
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/random_access_index.hpp>
int main(){
typedef boost::multi_index_container<
double, // simply store doubles
boost::multi_index::indexed_by<
boost::multi_index::random_access<>
>
> random_access_container;
random_access_container v; // fill container
v.reserve(10); // also tried this
v.push_back(1.);
v.push_back(2.);
v.push_back(3.);
assert(v[0] == 1.); // ok
assert(*(&v[0] + 1) == v[1]); // this fails, memory is not contiguous
}
Anmerkung 1: Das möchte ich für die Kompatibilität (so nutzen multi_index
Behälter --with anderen Zugang Optionen- Ich kann), sondern auch den direkten Speicherzugriff verwenden (wie es mit std::vector
möglich ist).
ANMERKUNG 2: Ich habe gerade dieses Zitat von der Dokumentation, http://www.boost.org/doc/libs/1_61_0/libs/multi_index/doc/reference/rnd_indices.html#rnd_indices, so dass es schaut schwierig.
Soweit nicht anders angegeben, oder wenn die entsprechende Schnittstelle nicht vorhanden, Random Access Indizes die gleichen Container Anforderungen wie std :: vector und die Anforderungen für std :: list spezifische Liste Operationen an [list.ops überprüfen ]. Einige der wichtigsten Unterschiede mit Bezug auf std :: vector sind:
Random Access Indizes bieten keine Speicher contiguity und somit keine Datenelementfunktionen haben.
...
Ist das, weil (Iterator) Stabilität eine Priorität im Design hatte? Im Prinzip kann die Reservefunktion dies erreichen, aber ich denke, es hätte die Implementierung enorm erschwert, oder? – alfC
Ich meine mit anderen Worten, warum 'stable_vector' (oder' multi_index') zusammenhängende Speicher (für Knoten) nicht reservieren würde, wenn die Anzahl der Elemente im Voraus bekannt ist? (Ich versuche zu sehen, ob es einen Umstand gibt, bei dem die Erinnerung ausgetrickst werden kann, ich suche nicht nach einer Garantie unter allen Bedingungen.) – alfC
Ich habe meiner Antwort einige Kommentare hinzugefügt, die hoffentlich deine Fragen beantworten. –