Когда компилятор выполняет RVO?

Кажется, есть много вопросов о том, когда компилятор будет выполнять RVO или почему он не выполняет его в такой-то ситуации.

После прочтения http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/ я не могу обернуться вокруг этого.

В основном кажется, что "обычно" компилятор выполняет какую-то оптимизацию, но бывают случаи, когда это невозможно.

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

Поэтому я должен передать ссылки, чтобы избежать копирования, или есть какой-нибудь способ узнать, оптимизирует ли компилятор копию?

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

2 ответа

Решение

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

Компилятор выполняет RVO, когда он считает, что RVO применимо.

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

Другие вопросы по тегам