如果我有一个glm::vec3
例子,我想给它分配一个新值,以下哪种方法更快?
vec = glm::vec3(1, 2, 3);
或者
vec.x = 1;
vec.y = 2;
vec.z = 3;
如果我理解正确,第一种方法执行以下操作:
- 调用
glm::vec3
构造函数在堆栈上创建一个新的临时向量 - 调用复制赋值操作符
glm::vec3
来复制新向量
而第二种方法只是分配并避免创建一个虚拟的临时向量,那么为什么我想做大量的 *** 而不是仅仅分配我的值呢?
如果我有一个glm::vec3
例子,我想给它分配一个新值,以下哪种方法更快?
vec = glm::vec3(1, 2, 3);
或者
vec.x = 1;
vec.y = 2;
vec.z = 3;
如果我理解正确,第一种方法执行以下操作:
glm::vec3
构造函数在堆栈上创建一个新的临时向量glm::vec3
来复制新向量而第二种方法只是分配并避免创建一个虚拟的临时向量,那么为什么我想做大量的 *** 而不是仅仅分配我的值呢?
不要想太多。
您实际上并不是在对计算机进行编程。你正在描述一个程序。使用您的描述创建将由计算机执行的程序是您的编译器的工作。这是由 C++ 标准的“as-if”规则提供支持的实际现实:只要真实(已编译)程序的可观察结果与您的描述相符(源代码)。
你的编译器非常非常聪明。无论您以哪种方式编写它,它都能够确保它不会针对此类情况执行过多、额外、不必要的步骤。对我来说*,两种方法的最终程序集是相同的,除非您降低优化级别(这实际上增加了“使程序看起来更像我的描述中的步骤”级别,这是一种调试功能)。
只需编写清晰、自文档、直接的代码来反映您的意图。只有当您遇到编译器可能没有尽其所能完成最佳工作的情况时,您才会介入此类问题。
是的,当您调用 glm::vec3 时,它将构造该对象,但如果这是您所抱怨的,那么两者之间实际上并没有太大的性能差异。所以,你可以使用它们中的任何一个,但第一个更好看。