«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Передача по значению или ссылке: когда фраза «Хотите скорости? Передача по значению» на самом деле верна?

Передача по значению или ссылке: когда фраза «Хотите скорости? Передача по значению» на самом деле верна?

Опубликовано 8 ноября 2024 г.
Просматривать:219

  Passing by Value or Reference: When is \

"Хотите скорость? Передавайте по значению" - изучение последствий для производительности

Утверждение Скотта Мейерса "Хотите скорости? Передавайте по значению" вызывает вопросы о преимуществах производительности при передаче объектов по значению, а не по ссылке. В этом контексте передача по значению включает в себя операцию копирования, а передача по ссылке позволяет избежать ненужных копий.

Рассмотрите следующий пример со структурами 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):

  • Lvalues: И X, и Y выполнят копирование (в X при инициализации имени, в Y при инициализации mem_name), за которым следует операция перемещения в X.
  • Rvalues: X может выполнять перемещение только в том случае, если можно применить RVO, тогда как Y по-прежнему требует копию.

Как правило, перемещение выполняется быстрее, чем передача указателя, что, по сути, и делает передача по ссылке. Таким образом, для rvalue X работает лучше, чем Y, а для lvalues ​​производительность одинакова.

Важно отметить, что это не универсальное правило, и оптимизация может различаться в зависимости от компилятора и платформы. Профилирование рекомендуется для определения оптимального подхода в конкретных случаях.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3