C ++ присваивает значения индивидуально или создает новый объект? - PullRequest
1 голос
/ 16 апреля 2020

Если у меня есть glm::vec3, например, и я хочу присвоить ему новое значение, какой из следующих методов быстрее?

vec = glm::vec3(1, 2, 3);

или

vec.x = 1;
vec.y = 2;
vec.z = 3;

Если я правильно понимаю, первый метод делает следующее:

  1. Вызывает конструктор glm::vec3 для создания нового временного вектора в стеке
  2. Вызывает оператор назначения копирования glm::vec3 чтобы скопировать новый вектор

В то время как второй метод - это просто присваивания и избегает создания фиктивного временного вектора, поэтому я бы хотел сделать тонну *** вместо того, чтобы просто присваивать свои значения

Ответы [ 2 ]

3 голосов
/ 16 апреля 2020

Не задумывайтесь над этим.

На самом деле вы не программируете компьютер; вы описываете программу . Работа вашего компилятора заключается в создании программы, которая будет выполняться компьютером, используя ваше описание. Это практическая реальность, основанная на правиле «как будто» стандарта C ++: компилятор не обязан следовать вашим «шагам» один за другим до тех пор, пока наблюдаемые результаты реальных (скомпилированных) ) программа соответствует вашему описанию (исходный код).

Ваш компилятор очень, очень умный. Он более чем способен гарантировать, что он не выполняет лишние, дополнительные, ненужные шаги для случаев вот так, как бы вы это ни написали. Для меня *, результирующая сборка для обоих подходов идентична , если только вы не понизите уровень оптимизации (который на самом деле увеличивает ), что делает программу более похожей шаги в моем описании "уровень, функция отладки).

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

* Хорошо, это было Марек ?

0 голосов
/ 16 апреля 2020

Да, когда вы вызываете glm :: vec3, он собирается сконструировать этот объект, но на самом деле между ними нет большой разницы в производительности, если вы на это жалуетесь. Таким образом, вы можете использовать любой из них, но первый лучше посмотреть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...