2017-09-08 2 views
0

Um mein Verständnis von small_vector zu testen, habe ich versucht, das Beispielprogramm unten, wo ich Vorlage der Vektor mit einer In-Place-Größe von 3 und bevölkern den Vektor mit 10 Elementen. Ich würde erwarten, dass die ersten drei Elemente an Ort und Stelle gespeichert werden und dass die letzten sieben Elemente im Free-Store nicht am Platz sind, aber das scheint nicht der Fall zu sein, wenn ich das Speicherlayout beobachte: Alle Artikel scheinen zusammenhängend und außerorts zu sein, wie bei einem normalen std::vector.boost :: container :: small_vector scheint nicht in-place zuzuweisen

Ich habe verschiedene Compiler (verschiedene Versionen von GCC und Clang) und verschiedene Boost-Versionen ausprobiert, aber das scheint keinen Unterschied zu machen. Der folgende Code ändert sich auch nicht:

  • Zuweisen des Vektors auf dem Free-Store.
  • Umgeben der vec lokalen mit großen Einheimischen vor und nach, und nur dann laden Sie es mit Elementen.

Gibt es eine gute Erklärung dafür?

#include <iostream> 
#include <boost/container/small_vector.hpp> 

int main() 
{ 
    auto vec = boost::container::small_vector<int, 3> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 

    for (const auto& num : vec) 
    { 
     std::cout << 
      "Index: " << num << 
      " Distance from vec[0]: " << (long)&num - (long)&vec[0] << 
      " Distance from vec: " << (long)&num - (long)&vec << "\n"; 
    } 
} 

Ausgang:

Index: 0 Distance from vec[0]: 0 Distance from vec: -140731961813152 
Index: 1 Distance from vec[0]: 4 Distance from vec: -140731961813148 
Index: 2 Distance from vec[0]: 8 Distance from vec: -140731961813144 
Index: 3 Distance from vec[0]: 12 Distance from vec: -140731961813140 
Index: 4 Distance from vec[0]: 16 Distance from vec: -140731961813136 
Index: 5 Distance from vec[0]: 20 Distance from vec: -140731961813132 
Index: 6 Distance from vec[0]: 24 Distance from vec: -140731961813128 
Index: 7 Distance from vec[0]: 28 Distance from vec: -140731961813124 
Index: 8 Distance from vec[0]: 32 Distance from vec: -140731961813120 
Index: 9 Distance from vec[0]: 36 Distance from vec: -140731961813116 
Index: 10 Distance from vec[0]: 40 Distance from vec: -140731961813112 

See: https://wandbox.org/permlink/zMGRxHlM96Riq9Ky

+1

Sie missverstehen, lesen Sie das Dokument erneut. Es ist alles oder nichts, benutze entweder den kleinen Puffer oder ordne einen großen zu und ignoriere den kleinen. Auf diese Weise benötigen Sie keinen bedingten Operator in [] und die Elemente bleiben zusammenhängend. –

+0

@MarcGlisse: Danke; Bitte posten Sie das als Antwort! – Ani

Antwort

1

In boost documentation,

small_vector

small_vector ein Vektor-like cont ist ainer optimiert für den Fall, wenn es wenige Elemente enthält. Sie enthält einige vorbelegte Elemente an Ort und Stelle, wodurch die Verwendung der dynamischen Speicherzuweisung vermieden werden kann, wenn die tatsächliche Anzahl der Elemente unter diesem vorbelegten Schwellenwert liegt. small_vector ist inspiriert von LLVMs SmallVector Container. Im Gegensatz zu static_vector kann die Kapazität von small_vector über die anfänglich vorbelegte Kapazität hinaus wachsen.

small_vector ist umwandelbar in small_vector_base, einen Typ, der von der vorab zugeordneten Elemente Zahl unabhängig ist, Client-Code ermöglicht, die auf diesem N Argumente templated wird nicht müssen. small_vector erbt alle Member-Funktionen des Vektors, so dass es alle Standard-Features wie Einlagerungs unterstützt, Stateful Verteilern, usw.

Er sagt, seine Fähigkeit, über die ursprüngliche wachsen kann, aber nicht sagen, dass die anfängliche Lagerung verwendet wird wenn die Kapazität wächst.

Die "Vektor" -Dinge werden normalerweise als zusammenhängend erwartet und es bringt viele Vorteile. (rohe Zeiger als Iteratoren, Super-Speed-Direktzugriff, etc ..) Verzicht auf diese Vorteile zur Verringerung der kleinen dynamischen Speicherauslastung (denken Sie daran, dass "small"_vector ist) ist kein guter Handel.

+0

Ah; Aha. Ich nahm nur an, dass der anfängliche Speicher immer verwendet würde. Vielen Dank! – Ani

+0

@Ani Ich habe eine Erklärung hinzugefügt, warum es nicht geht. – ikh