例如,如果我有一个glm::vec3
,并且想为其分配一个新值,那么以下哪种方法更快?
vec = glm::vec3(1, 2, 3);
或
vec.x = 1;
vec.y = 2;
vec.z = 3;
如果我理解正确,第一种方法会执行以下操作:
glm::vec3
构造函数在堆栈上创建一个新的临时向量glm::vec3
的复制分配运算符复制新矢量第二种方法只是赋值,避免创建虚拟的临时矢量,那为什么我要做大量的***而不仅仅是赋值呢?
答案 0 :(得分:3)
不要想太多。
您实际上并不是在对计算机编程; 您正在描述程序 。使用您的描述来创建将由计算机执行的程序是编译器的工作。这是由C ++标准的“按条件”规则提供支持的实际情况:编译器没有义务一步一步地遵循您的“步骤” ,只要实际结果(编译)程序匹配您的描述(源代码)。
您的编译器非常非常聪明。它有足够的能力确保它不会针对此类情况执行过多的,额外的,不必要的步骤,无论您以哪种方式编写。对于我*,the resulting assembly for both approaches is identical,除非您降低优化级别(这实际上是增加,即“使程序看起来更像我描述中的步骤”级别,这是调试功能)。< / p>
只需编写能反映您意图的清晰,自记录,简单的代码即可。只有在某些情况下,编译器可能未尽其所能,您才会介入诸如此类的问题这个。
答案 1 :(得分:0)
是的,当您调用glm :: vec3时,它将构造该对象,但是如果您要抱怨的话,两者之间实际上并没有太大的性能差异。因此,您可以使用它们中的任何一个,但是第一个比较好看。