2017-09-08 1 views
0

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

+1

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. –

+0

@MarcGlisse: Merci; S'il vous plaît poster cela comme une réponse! – Ani

Répondre

1

En boost documentation,

small_vector

small_vector est un cont vecteur semblable ainer optimisé pour le cas lorsqu'il contient peu d'éléments. Il contient des éléments pré-alloués sur place, ce qui lui permet d'éviter l'utilisation de l'allocation de stockage dynamique lorsque le nombre réel d'éléments est inférieur au seuil préalloué . small_vector est inspiré du conteneur SmallVector de LLVM. Contrairement à static_vector, la capacité de small_vector peut augmenter de au-delà de la capacité préallouée initiale.

small_vector est convertible en small_vector_base, un type qui est indépendant de l'élément préaffecté nombre, ce qui permet le code client qui n'a pas besoin d'être sur cet argument basé sur un modèle N. small_vector hérite des fonctions de membres de tous les vecteurs de sorte qu'il supporte toutes les fonctionnalités standard comme emplacement, allocataires stateful, etc.

Il dit sa capacité peut se développer au-delà de la première, mais ne dit pas que le stockage initial sera utilisé quand la capacité augmente.

Les choses "vectorielles" sont généralement attendues comme étant contiguës, et cela présente de nombreux avantages. (pointeurs bruts comme itérateurs, accès aléatoire super-rapide, etc.) Abandonner ces avantages pour réduire l'utilisation de mémoire dynamique faible (rappelez-vous que c'est "small"_vector) n'est pas un bon métier.

+0

Ah; Je vois. J'ai juste supposé que le stockage initial serait toujours utilisé. Merci! – Ani

+0

@Ani J'ai ajouté une explication pourquoi ce n'est pas le cas. – ikh