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
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. –
@MarcGlisse: Danke; Bitte posten Sie das als Antwort! – Ani