Pour tester ma compréhension de small_vector
, j'ai essayé le programme d'exemple ci-dessous, où je modèle le vecteur avec une taille in-situ de 3 et peupler le vecteur avec 10 éléments. Je m'attendrais à ce que les 3 premiers éléments soient stockés sur place et que les 7 derniers éléments soient stockés à l'extérieur du magasin libre, mais cela ne semble pas être le cas lorsque j'observe la disposition de la mémoire: tous les articles semblent être stockés de manière contiguë et hors-lieu, comme avec un std::vector
régulier.boost :: container :: small_vector ne semble pas allouer en place
J'ai essayé différents compilateurs (différentes versions de GCC et Clang) et différentes versions de Boost, mais cela ne semble pas faire de différence. Le code suivant ne change pas non plus:
- Allouer le vecteur lui-même sur le magasin libre.
- Entourant le
vec
local avec des locales de grande taille avant et après, et seulement ensuite le charger avec des éléments.
Y at-il une bonne explication à cela?
#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";
}
}
Sortie:
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
Voir: https://wandbox.org/permlink/zMGRxHlM96Riq9Ky
Vous avez mal compris, relisez le document. C'est tout ou rien, soit utiliser le petit buffer, soit en allouer un gros et ignorer le petit. De cette façon, vous n'avez pas besoin d'un opérateur conditionnel [] et les éléments restent contigus. –
@MarcGlisse: Merci; S'il vous plaît poster cela comme une réponse! – Ani