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

标签 c++ copy-assignment

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

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

要么

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

如果我理解正确,第一种方法将执行以下操作:
  • 调用glm::vec3构造函数在堆栈上创建一个新的临时 vector
  • 调用glm::vec3的复制分配运算符以复制新的 vector

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

    最佳答案

    不要想太多。

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

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

    只需编写反射(reflect)您意图的清晰,可自我记录的简单代码即可。 只有在某些情况下编译器可能未尽其所能,您才可以进行此类问题的干预。

    *好吧,it was Marek😉

    关于c++ - C++分别分配值还是创建一个新对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61239187/

    相关文章:

    c++ - 在 C++ 中右对齐 getline() 输入

    c++ - 我应该在复制赋值运算符中使用 placement-new

    c++ - 为什么删除模板复制构造函数会导致赋值运算符功能失调?

    c++ - 填充插入() - 复制构造函数和复制赋值 noexcept 状态?

    c++ - 在另一个线程中使用线程 vector : error attempting to reference a deleted function

    c++ - 如何在对象库中部分公开对象内容?

    c++ - 命名空间范围内的 constexpr 变量,有和没有显式内联定义

    c++ - 什么时候调用复制赋值运算符?

    C++拷贝构造函数

    c++ - 在模板类函数定义中使用 "this"指针 -- 表达式必须具有 (pointer-to-) 函数类型