Taille du vecteur vide

Le programme suivant, exécuté avec g++ 4.8.2 donnait la sortie 12 sur un système Linux 32 bits:

 vector v; cout << sizeof(v) << endl; 

J’ai vu cela et je sais que sizeof(v) pourrait être spécifique à la mise en œuvre. Néanmoins, je me demandais ce qui pourrait v.begin() taille de ce vecteur. Ce que je pense, c’est que les iterators v.begin() et v.end() pourraient consortingbuer à 8 octets de la taille. Ai-je raison? Si oui, quelle est la consortingbution aux 4 octets de taille restants? Si non, en quoi consistent ces 12 octets?

Regardez les sources. libstdc++ fait partie du téléchargement gcc.

Quoi qu’il en soit, le conteneur doit avoir ces membres (ou équivalent, comme tous les pointeurs):

  1. Un pointeur de données, 4 octets pour un caractère char* .
  2. Un nombre d’éléments ou un pointeur de fin, 4 octets pour un size_t ou char* .
  3. Une taille de tampon ou un pointeur sur la fin de la mémoire tampon, 4 octets pour un size_t ou char* .
  4. L’allocateur standard (type sortingvial vide) n’a pas besoin de place, grâce à quelques astuces d’implémentation (optimisation de classe de base vide, et peut-être d’une spécialisation de modèle partielle).

En théorie, les valeurs 2 et 3 pourraient être plus petites, voire plus précises. Bien que ce serait curieux, cela limiterait la taille maximale.

Ensemble de 12 octets, comme prévu.

Typiquement std :: vector a:

 1. Start of allocation / begin 2. End of vector (begin + size) 3. End of allocation (begin + capacity) 

La taille 12 est donc tout à fait justifiée sur une machine 32 bits.

Le fichier std::vector libstdc ++ est dérivé d’une base avec un membre de données de ce type:

  struct _Vector_impl : public _Tp_alloc_type { pointer _M_start; pointer _M_finish; pointer _M_end_of_storage; ... 

_M_end_of_storage prend en charge .capacity() / redimensionnement, etc.