首页 > 解决方案 > C++ 单独赋值还是创建一个新对象?

问题描述

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

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

或者

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

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

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

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

标签: c++copy-assignment

解决方案


不要想太多。

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

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

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

*好吧, 马雷克


推荐阅读