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

StackOverflow https://stackoverflow.com/questions/665825

Вопрос

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

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

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 ); 
}
Это было полезно?

Решение

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

  • создайте локальное временное значение, скопируйте-сконструируйте его в возвращаемое значение и скопируйте-сконструируйте возвращаемое значение в локальное "c". или
  • создайте локальное временное значение и скопируйте-сконструируйте его в "c". или
  • сконструируйте "c" с аргументами "i,d".

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top