Присвойте тип возврата для ссылки, происходит ли копирование? - PullRequest
1 голос
/ 23 ноября 2011

Копия все еще здесь:

std::vector<int> &f = foo();

, где прототип foo

std::vector<int> foo();

Ответы [ 2 ]

8 голосов
/ 23 ноября 2011

foo() возвращает временный объект, который не может быть привязан к неконстантной ссылке.

Выполните одно из следующих действий:

//temporary can be bound to const-reference, so this is ok
const std::vector<int> &f = foo();  //no copy takes place.

//or save a copy of temporary
std::vector<int> f = foo(); //copy takes place (may be optimized by compiler)

Прочитайте комментарии выше,Во второй версии (не ссылочной версии) компилятор может оптимизировать возвращаемое значение, избегая копирования временного.Это также зависит от реализации foo().

См. Это:

2 голосов
/ 23 ноября 2011

Ваш код не является законным. Должно быть либо:

std::vector<int> const& f = foo();

или

std::vector<int> f = foo();

Стандарт разрешает копирование в обоих случаях (по крайней мере, C ++ 03 сделал & mdash; I Подумайте, C ++ 11 в первом случае исправил ситуацию); это требует этого в ни один, и я не знаю компилятор, который на самом деле делает копию в в любом случае. Если вы действительно беспокоитесь о копии, хотя, изменение декларация от foo до:

void foo( std::vector<int>& results );

и использование:

std::vector<int> f;
foo( f );

гарантирует, что нигде не будет копий. Это не так красиво, но если профилирование показывает, что копирование является узким местом, оно должно быть считается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...