C ++分别分配值还是创建一个新对象?

时间:2020-04-15 21:47:41

标签: c++ copy-assignment

例如,如果我有一个glm::vec3,并且想为其分配一个新值,那么以下哪种方法更快?

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

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

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

  1. 调用glm::vec3构造函数在堆栈上创建一个新的临时向量
  2. 调用glm::vec3的复制分配运算符复制新矢量

第二种方法只是赋值,避免创建虚拟的临时矢量,那为什么我要做大量的***而不仅仅是赋值呢?

2 个答案:

答案 0 :(得分:3)

不要想太多。

您实际上并不是在对计算机编程; 您正在描述程序 。使用您的描述来创建将由计算机执行的程序是编译器的工作。这是由C ++标准的“按条件”规则提供支持的实际情况:编译器没有义务一步一步地遵循您的“步骤” ,只要实际结果(编译)程序匹配您的描述(源代码)。

您的编译器非常非常聪明。它有足够的能力确保它不会针对此类情况执行过多的,额外的,不必要的步骤,无论您以哪种方式编写。对于我*,the resulting assembly for both approaches is identical,除非您降低优化级别(这实际上是增加,即“使程序看起来更像我描述中的步骤”级别,这是调试功能)。< / p>

只需编写能反映您意图的清晰,自记录,简单的代码即可。只有在某些情况下,编译器可能未尽其所能,您才会介入诸如此类的问题这个。

* 好的,it was Marek?

答案 1 :(得分:0)

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