Копировать конструктор против оптимизации возвращаемого значения - PullRequest
6 голосов
/ 20 марта 2009

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

Требуется ли это стандартом или можно оптимизировать функцию, создав переменную «назначено» даже внутри тела функции?

struct C { int i; double d; };

C f( int i, int d ) {
    return C(i,d); // construct _and_ copy-construct?
}

int main() {
    C c = f( 1, 2 ); 
}

Ответы [ 4 ]

7 голосов
/ 20 марта 2009

Стандарт допускает любой уровень пропуска копирования здесь:

  • создать локальный временный объект, скопировать-создать его в возвращаемое значение и скопировать-создать возвращаемое значение в локальный "c". OR
  • создайте локальный временный объект и скопируйте его в "c". OR
  • построить "c" с аргументами "i, d"
7 голосов
/ 20 марта 2009

Стандарт гласит, что конструктор копирования не требуется - см. Раздел 12.8 / 15:

15 Всякий раз, когда временный объект класса копируется с помощью конструктора копирования, и этот объект и копия имеют тот же CV-неквалифицированный тип, Реализация разрешено лечить оригинал и копия как два различные способы обращения к тот же объект и не выполнять копию в все, даже если копия класса конструктор или деструктор имеют сторону последствия.

И многое другое в том же духе.

0 голосов
/ 20 марта 2009

Не передать параметр по ссылке и не присвоить ему результат?

0 голосов
/ 20 марта 2009

Существует один очень простой и хороший способ полностью избежать таких соображений - вы можете рассмотреть возможность возврата boost :: shared_ptr к созданному объекту - он будет практически таким же, когда дело доходит до удобства использования, но ваш объект наверняка не будет скопирован без необходимости - и это будет также верно, если вы вернете его через несколько уровней вызовов функций.

...