"Хотите скорость? Передавайте по значению" - изучение последствий для производительности
Утверждение Скотта Мейерса "Хотите скорости? Передавайте по значению" вызывает вопросы о преимуществах производительности при передаче объектов по значению, а не по ссылке. В этом контексте передача по значению включает в себя операцию копирования, а передача по ссылке позволяет избежать ненужных копий.
Рассмотрите следующий пример со структурами X и Y:
struct X {
std::string mem_name;
X(std::string name) : mem_name(std::move(name)) {}
};
struct Y {
std::string mem_name;
Y(const std::string &name) : mem_name(name) {}
};
В конструкторе X имя аргумента копируется во временный объект перед вызовом конструктора перемещения в std::string для инициализации mem_name. В конструкторе Y имя аргумента является константной ссылкой, но копия по-прежнему создается для инициализации mem_name. Следовательно, X выполняет операцию «копировать-затем-переместить», а Y выполняет одну копию.
Согласно аргументу Мейерса, может показаться, что передача по значению (как в X) может быть быстрее из-за потенциал для оптимизации, такой как оптимизация возвращаемого значения (RVO). Однако более внимательное рассмотрение показывает, что результат зависит от типа передаваемого аргумента (lvalue или rvalue):
Как правило, перемещение выполняется быстрее, чем передача указателя, что, по сути, и делает передача по ссылке. Таким образом, для rvalue X работает лучше, чем Y, а для lvalues производительность одинакова.
Важно отметить, что это не универсальное правило, и оптимизация может различаться в зависимости от компилятора и платформы. Профилирование рекомендуется для определения оптимального подхода в конкретных случаях.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3