Рассмотрим случай, когда из функций возвращаются «целые» объекты с включенной семантикой перемещения, как в случае с std::basic_string<>
:
std::wstring build_report() const
{
std::wstring report;
...
return report;
}
Могу ли я тогда реально ожидать, что сделаю «лучший» выбор, использовать ли возвращаемую строку с семантикой перемещения, как в
const std::wstring report(std::move(build_report()));
или если я должен полагаться на (N)RVO, чтобы иметь место с
const std::wstring report(build_report());
или даже привязать константную ссылку к временному с помощью
const std::wstring& report(build_report());
Какая существует схема для детерминированного выбора этих вариантов, если таковые имеются?
РЕДАКТИРОВАТЬ 1: Обратите внимание, что использование std::wstring
выше — это всего лишь пример типа с включенной семантикой перемещения. Его с таким же успехом можно поменять на свой arbitrary_large_structure
. :-)
EDIT 2: я проверил сгенерированную сборку при запуске оптимизированной по скорости сборки выпуска в VS 2010 из следующего:
std::wstring build_report(const std::wstring& title, const std::wstring& content)
{
std::wstring report;
report.append(title);
report.append(content);
return report;
}
const std::wstring title1(L"title1");
const std::wstring content1(L"content1");
const std::wstring title2(L"title2");
const std::wstring content2(L"content2");
const std::wstring title3(L"title3");
const std::wstring content3(L"content3");
int _tmain(int argc, _TCHAR* argv[])
{
const std::wstring report1(std::move(build_report(title1, content1)));
const std::wstring report2(build_report(title2, content2));
const std::wstring& report3(build_report(title3, content3));
...
return 0;
}
2 самых интересных исхода:
- Явный вызов
std::move
дляreport1
для использования конструктора перемещения утроивает количество инструкций. - Как отметил Джеймс Макнеллис в его ответ ниже,
report2
иreport3
действительно генерируют идентичные сборки с в 3 раза меньшим количеством инструкций, чем при явном вызовеstd::move
.
move
не встроен и не удален. - person James McNellis   schedule 30.06.2011std::move
здесь не встроен; Я действительно нахожу это озадачивающим. Я в отпуске до конца следующей недели, так что пройдет пара недель, прежде чем я смогу вернуться к вам. - person James McNellis   schedule 01.07.2011