Si j’ai en C ++ un pointeur sur un vecteur:
vector* vecPtr;
Et j’aimerais accéder à un élément du vecteur, puis je peux le faire en annulant le vecteur:
int a = (*vecPtr)[i];
mais ce déréférencement va-t-il réellement créer une copie de mon vecteur sur la stack? disons que le vecteur stocke 10000 ints, en déréférencant le vecPtr 10000 ints être copié?
Merci!
10000 int
s ne seront pas copiés. Dereferencing est très bon marché.
Pour que ce soit clair, vous pouvez réécrire
int a = (*vecPtr)[i];
comme
vector& vecRef = *vecPtr; // vector is not copied here int a = vecRef[i];
En outre, si vous craignez que l’ensemble des données stockées dans vector
se trouve sur la stack et que vous utilisez le vector
au lieu du vector
pour éviter cela: ce n’est pas le cas. En fait, seule une quantité de mémoire fixe est utilisée sur la stack (environ 16 à 20 octets en fonction de l’implémentation), indépendamment du nombre d’éléments stockés dans le vector
. Le vector
lui vector
même alloue de la mémoire et stocke des éléments sur le tas.
Non, rien ne sera copié; le déréférencement dit simplement à C ++ que vous voulez invoquer operator [] sur le vecteur , pas sur votre pointeur , vecPtr
. Si vous n’avez pas déréférencé, C ++ tenterait de rechercher un opérateur [] défini sur le type std::vector
.
Cela peut devenir vraiment déroutant, car operator[]
est défini pour tous les types de pointeurs, mais cela revient à décaler le pointeur comme s’il pointait vers un tableau de vector
. Si vous n’y aviez réellement assigné qu’un seul vecteur, alors pour tout index autre que 0
, l’expression renvoie à une référence à garbage, vous obtiendrez donc un segfault ou quelque chose auquel vous ne vous attendiez pas.
En général, accéder à des vecteurs via un pointeur est (*vecPtr)[index]
, et la syntaxe (*vecPtr)[index]
est maladroite (mais meilleure que vecPtr->operator[](index)
). Au lieu de cela, vous pouvez utiliser:
vecPtr->at(index)
Cela vérifie les plages, contrairement à operator[]
, donc si vous ne voulez pas payer le prix pour vérifier si l’index est dans les limites, vous êtes bloqué avec (*vecPtr)[]
.