Когда разыменование указателя вызывает копирование в c ++? - PullRequest
0 голосов
/ 28 января 2020

В основном мне любопытно, когда разыменование указателя приводит к созданию копии. Насколько я понимаю, указатели являются высокоуровневой конструкцией и что если вы разыменовываете в ссылочную переменную, она не делает копию, но если вы разыменовываете в переменную, она делает копию.

Итак это не сделает копию:

int num = 10;
int *ptr = #
int& num2 = *ptr;

Но это будет:

int num = 10;
int *ptr = #
int num2 = *ptr;

Это правильно? Когда именно ссылка вызывает создание копии, если вообще?

1 Ответ

1 голос
/ 28 января 2020

Разыменование само по себе никогда не делает копию. Хотя разыменование указателя просто применяет оператор *, и в вашем коде происходит нечто большее.

Здесь:

int num = 10;
int *ptr = #
int& num2 = *ptr;

последняя строка разыменовывает указатель и использует результат для инициализации ссылка num2. num2 теперь ссылки num. Никаких копий.

Здесь:

int num = 10;
int *ptr = #
int num2 = *ptr;

в последней строке вы первый раз ptr затем используйте результат для инициализации num2. Поскольку num2 является значением, копия сделана.

Вам не нужны указатели, чтобы увидеть тот же эффект:

int x = 42;
int& y = x;   // no copy, y is an alias for x
int z = x;    // z is a copy of x
...