Как я могу быть уверен, что оптимизация возвращаемого значения будет выполнена

Я написал функции, которые возвращают огромные объекты по значению. Мои коллеги жалуются, что он сделает избыточное копирование, и предлагают возвращать объекты по ссылке в качестве аргумента функции. Я знаю, что оптимизация возвращаемого значения будет выполнена, а копии будут удалены, но код будет использоваться в библиотеке, которая может быть скомпилирована разными компиляторами, и я не могу протестировать их все. Чтобы убедить моего коллегу в том, что возвращать объекты по значению можно с помощью сохранения, мне нужен документ, в котором это указано.

Я посмотрел на стандарт C ++ 03, но не могу найти ничего об оптимизации возвращаемого значения. Можете ли вы дать ссылку на документ (стандарт), где определено, что RVO будет сделано. Или, если он не существует, где я могу найти список компиляторов, которые поддерживают RVO?

3

Решение

Стандарт никогда не гарантирует, что RVO произойдет, он просто позволяет это.

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

Но, в конце концов, каждый достойный компилятор может выполнять RVO во многих случаях, и даже если RVO не происходит, конструкция перемещения C ++ 11 (и более поздние версии) может сделать возврат относительно дешевым.

2

Другие решения

Один из способов, который вы можете использовать, чтобы доказать своим коллегам, что RVO выполняется, — это вставить printfs или другие подобные операторы в код.

HugeObject& HugeObject::operator=(const HugeObject& rhs)
{
printf("HugeObject::operator= called\n");
}

а также

HugeObject::HugeObject(const HugeObject& rhs)
{
printf("HugeObject::copy constructor called\n");
}

а также

HugeObject SomeFunctionThatCreatesHugeObject()
{
...
printf("SomeFunction returning HugeObject\n"}

Затем запустите соответствующий код и убедитесь, что ожидаемое количество объектов было создано / скопировано.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector