C++ sizeof vecteur est 24?

J'étais juste en train de déconner et d'apprendre sur les vecteurs ainsi que les structures, et à un moment donné, j'ai essayé de sortir la taille d'un vecteur en octets. Voici le code:

#include <iostream>
#include <vector>

struct Foo{
    std::vector<int> a;
};

int main()
{
    using std::cout; using std::endl;   

    Foo* f1 = new Foo;

    f1->a.push_back(5);
    cout << sizeof(f1->a) << endl;
    cout << sizeof(f1->a[0]) << endl;

    delete[] f1;
}

La sortie est 24 et 4.

Évidemment, la deuxième ligne a imprimé 4, car c'est la taille d'un int. Mais pourquoi exactement l'autre valeur 24? Un vecteur prend-il 24 octets de mémoire? Merci!

23
demandé sur Archie Gertsman 2015-12-01 19:10:17

1 réponses

Alors que l'interface publique de std::vector est définie par la norme, il peut y avoir différentes implémentations : en d'autres termes, ce qui est sous le capot de std::vector peut changer d'implémentation en implémentation.

Même dans la même implémentation (par exemple: l'implémentation STL fournie avec une version donnée de Visual C++), les internes de std::vector peuvent changer à partir des versions release et debug.

La taille 24 que vous voyez peut être expliquée comme 3 pointeurs (chaque pointeur est 8 octets de taille sur les architectures 64 bits; vous avez donc 3 x 8 = 24 octets). Ces pointeurs peuvent être:

  • début du vecteur
  • fin du vecteur
  • fin de la mémoire réservée au vecteur (c.-à-d. capacité du vecteur )
36
répondu Mr.C64 2015-12-01 16:15:31