Déréférencement du pointeur de vecteur pour accéder à l’élément

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)[] .