Кажется, есть много вопросов о том, когда компилятор будет выполнять RVO или почему он не выполняет его в такой-то ситуации.
После прочтения http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
Кажется, я тоже не могу обернуться вокруг этого.
Обычно кажется, что «обычно» компилятор выполняет какую-то оптимизацию, но бывают случаи, когда это невозможно.
Если я правильно понимаю статью Дэйва Абрахамса, он на самом деле не предлагает возвращать по значению, за исключением соображений лучшей читабельности. Для меня это говорит о том, что для удобочитаемости и согласованности может быть хорошей идеей всегда передавать ссылки для больших выходных значений.
Поэтому я должен передать ссылки, чтобы избежать копирования, или есть какой-нибудь способ узнать, оптимизирует ли компилятор копию?
Кроме того, стоит ли попытаться выяснить, будет ли компилятор оптимизировать определенным образом на самом деле меньше, чем просто передача по ссылке?
Весь смысл статьи в том, чтобы сообщить вам, что вы не стоит беспокоиться об этом. Оптимизация — это черный ящик, который не должен вас волновать, за исключением самых редких ситуаций.
Компилятор выполняет RVO когда он считает RVO применимым.
Любой приличный компилятор это поддержит. Просто используйте его, если вы точно не знаете, что вам нужно поддерживать компилятор, который этого не делает.