Question Le déréférencement d'un pointeur en fait-il une copie?


Le fait de déréférencer un pointeur et de le transmettre à une fonction qui prend son argument par référence crée-t-il une copie de l'objet?


29
2017-12-14 07:23


origine


Réponses:


Dans ce cas, la valeur du pointeur est copiée (bien que ce ne soit pas nécessairement le cas, car l'optimiseur peut l'optimiser).

int val = *pPtr;

Dans ce cas, cependant, aucune copie n'aura lieu:

int& rVal = *pPtr;

La raison pour laquelle aucune copie n'a lieu est qu'une référence n'est pas une construction de niveau machine. C'est une construction de niveau supérieur et c'est quelque chose que le compilateur utilise en interne plutôt que de générer un code spécifique pour cela.

La même chose, évidemment, vaut pour les paramètres de fonction.


27
2017-12-14 07:30



Dans le cas simple, non. Il y a des cas plus compliqués, cependant:

void foo(float const& arg);
int * p = new int(7);
foo(*p);

Ici, un objet temporaire est créé, car le type du pointeur déréférencé (int) ne correspond pas au type de base du paramètre de fonction (float). Une séquence de conversion existe et le temporaire converti peut être lié à arg puisque c'est une référence const.


6
2017-12-14 09:32



Non. Une référence est plus ou moins comme un pointeur avec une notation différente et la restriction qu'il n'y a pas de référence nulle. Mais comme un pointeur, il ne contient que l'adresse d'un objet.


3
2017-12-14 07:26



J'espère que ce n'est pas le cas: si la fonction appelée prend son argument par valeur.

De plus, c'est le comportement attendu d'une référence:

void inc(int &i) { ++i; }

int main()
{
    int i = 0;
    int *j = &i;
    inc(*j);
    std::cout << i << std::endl;
}

Ce code est censé imprimer 1  car  inc prend son argument par référence. Une copie avait-elle été faite sur inc appeler, le code s'imprimerait 0.


3
2017-12-14 07:25