c++ - C++ 单独赋值还是创建一个新对象?
问题描述
如果我有一个glm::vec3
例子,我想给它分配一个新值,以下哪种方法更快?
vec = glm::vec3(1, 2, 3);
或者
vec.x = 1;
vec.y = 2;
vec.z = 3;
如果我理解正确,第一种方法执行以下操作:
- 调用
glm::vec3
构造函数在堆栈上创建一个新的临时向量 - 调用复制赋值操作符
glm::vec3
来复制新向量
而第二种方法只是分配并避免创建一个虚拟的临时向量,那么为什么我想做大量的 *** 而不是仅仅分配我的值呢?
解决方案
不要想太多。
您实际上并不是在对计算机进行编程。你正在描述一个程序。使用您的描述创建将由计算机执行的程序是您的编译器的工作。这是由 C++ 标准的“as-if”规则提供支持的实际现实:只要真实(已编译)程序的可观察结果与您的描述相符(源代码)。
你的编译器非常非常聪明。无论您以哪种方式编写它,它都能够确保它不会针对此类情况执行过多、额外、不必要的步骤。对我来说*,两种方法的最终程序集是相同的,除非您降低优化级别(这实际上增加了“使程序看起来更像我的描述中的步骤”级别,这是一种调试功能)。
只需编写清晰、自文档、直接的代码来反映您的意图。只有当您遇到编译器可能没有尽其所能完成最佳工作的情况时,您才会介入此类问题。
推荐阅读
- django - 如何在 DRF-YASG 中为 DRF 和 DJANGO 消除 swagger-ui 中的 id 路径参数
- angular - 如何从不同的服务发出异步请求 [Angular]
- tensorflow - 2019-03 最新安装的 cudnn 按照 tensorflow apt-get Ubuntu 18.04 说明不再有效。接下来要尝试什么?
- php - 在类扩展中传递变量
- sql - 将 Crystal“如果以前”转换为 SQL
- c++ - 非会员获取方式
为命名空间中的自定义类工作 [C++17] - vue.js - 无法在 cellClick 上打开模式
- angular - 制作后如何使自定义字体不出现在根目录中
- sql-server - 当 200 个用户访问站点并同时调用一个商店导致 SQL Server Azure 死机时如何找到解决方案
- javascript - QuerySelector 没有显示我输入它要做什么 + 为什么 onClick 不能与 index.html 和 app.js 文件一起使用?