Конструктор копирования противоптимизация возвращаемого значения
-
21-08-2019 - |
Вопрос
В предыдущий вопрос, оказалось, что простая функция возврата по значению всегда копирует свою 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 к созданному объекту - это будет практически то же самое, когда дело доходит до удобства использования, но ваш объект, безусловно, не будет скопирован без необходимости - и это также будет верно, если вы вернете его через пару уровней вызовов функций.