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):
char*
. size_t
ou char*
. size_t
ou char*
. 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.