Копировать конструктор против оптимизации возвращаемого значения

c++ copy-constructor return-value-optimization

4088 просмотра

4 ответа

32498 Репутация автора

В предыдущем вопросе выяснилось, что простая функция возврата по значению всегда копирует свой 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 ); 
}
Автор: xtofl Источник Размещён: 20.03.2009 11:54

Ответы (4)


7 плюса

0 Репутация автора

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

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

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

Автор: anon Размещён: 20.03.2009 12:02

8 плюса

0 Репутация автора

Решение

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

  • создайте локальное временное, скопируйте его в возвращаемое значение и скопируйте возвращаемое значение в локальное «с». ИЛИ ЖЕ
  • создайте локальный временный код и скопируйте его в "c". ИЛИ ЖЕ
  • построить "c" с аргументами "i, d"
Автор: Iraimbilanja Размещён: 20.03.2009 12:02

-1 плюса

1560 Репутация автора

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

Автор: RnR Размещён: 20.03.2009 12:04

0 плюса

5727 Репутация автора

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

Автор: Darius Kucinskas Размещён: 20.03.2009 12:40
Вопросы из категории :
32x32