1

如果我有一个glm::vec3例子,我想给它分配一个新值,以下哪种方法更快?

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

或者

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

如果我理解正确,第一种方法执行以下操作:

  1. 调用glm::vec3构造函数在堆栈上创建一个新的临时向量
  2. 调用复制赋值操作符glm::vec3来复制新向量

而第二种方法只是分配并避免创建一个虚拟的临时向量,那么为什么我想做大量的 *** 而不是仅仅分配我的值呢?

4

2 回答 2

3

不要想太多。

您实际上并不是在对计算机进行编程。你正在描述一个程序。使用您的描述创建将由计算机执行的程序是您的编译器的工作。这是由 C++ 标准的“as-if”规则提供支持的实际现实:只要真实(已编译)程序的可观察结果与您的描述相符源代码)。

你的编译器非常非常聪明。无论您以哪种方式编写它,它都能够确保它不会针对此类情况执行过多、额外、不必要的步骤。对我来说*,两种方法的最终程序集是相同的,除非您降低优化级别(这实际上增加了“使程序看起来更像我的描述中的步骤”级别,这是一种调试功能)。

只需编写清晰、自文档、直接的代码来反映您的意图。只有当您遇到编译器可能没有尽其所能完成最佳工作的情况时,您才会介入此类问题。

*好吧, 马雷克

于 2020-04-15T22:03:23.833 回答
0

是的,当您调用 glm::vec3 时,它将构造该对象,但如果这是您所抱怨的,那么两者之间实际上并没有太大的性能差异。所以,你可以使用它们中的任何一个,但第一个更好看。

于 2020-04-15T21:54:43.813 回答