Is ++(a = b); faster than a = b + 1;?
Is ++(a = b); faster than a = b + 1;?
使用++(a = b);
而不是a = b + 1;
更快吗?
据我了解,第一种方法包括以下操作:
- 将
b
的值移动到a
- 增加内存中的
a
而第二种方法确实:
- 将
b
和1
推送到堆栈 - 呼叫添加
- 将结果弹出到寄存器
- 将寄存器移动到
a
它实际上需要更少的周期吗?还是编译器(例如 gcc)进行了优化,因此不会产生影响?
编辑:至少在C++11之前,++(a=b)
错误的非法UB是错误的。尽管如此,我将讨论这个问题,假设它是合法的,或者编译器做了你所期望的。
一般来说,a = b + 1;
更快。
优化器肯定会对两者进行相同的操作。如果没有,它更有可能优化第二个版本,因为它是一件非常普遍的事情,并且省略器比奇怪的极端情况更有可能识别常见的东西。
为什么我说优化后应该是一样的,但第二个更快?因为其他开发人员。每个人都能立即认出a = b + 1;
。没有人真的需要考虑它。另一种情况更有可能引发诸如"wtf 他在那里做什么,为什么?"之类的反应。许多人最终会弄清楚你在那里做了什么。有些不会。有些人甚至可能会因此引入错误。很少有人会发现你为什么这样做,但每次他们必须阅读那行时都会绊倒。每个人都会在阅读这一行时浪费时间思考。这就是为什么另一个更快。
警告:所有这些都是默默编写的,假设您正在谈论内置类型,例如int
或指针。你对两者所做的事情的解释支持这一点。如果我们谈论的是UDT,则甚至不能保证这两行相同。然后它完全取决于如何实现operator=
、operator++
和operator+
,也许还有从int的转换。然而,如果实现让你写++(a=b)
,它们很可能是糟糕的实现,应该改进而不是被黑客入侵。
tl;DR:如果我发现你在我工作的任何代码库中做++(a=b)
,我们将不得不进行认真的交谈;-)
这个问题没有简单的答案。这个问题已被标记为C++因此,如果不知道所有操作数的确切类型,我们就无法知道这段代码实际上在做什么。此外,代码出现的上下文将对优化器生成代码的方式产生影响 - 编译器可以别名变量并将增量移动到程序下方的指令中,例如,进入两个变量的有效地址计算。
但真正的问题是,你为什么关心?正如 Arne 上面所说,可读性更为重要,您还没有发布任何差异都会产生可衡量影响的场景。
只有在它确实引起问题时才担心它。
优化后,它们会为我生成完全相同的代码,因此它们将执行完全相同的操作。这应该不足为奇,因为这两个语句的效果完全相同。
++(a = b);
是未定义的行为,因为对a
有两个未排序的修改。
尽管a = b
中a
的值计算是在修改a
++
之前排序的,但a = b
的副作用(存储到a
)相对于++
的副作用(再次,存储到a
)是未排序的。
- Why is UINT32_MAX + 1 = 0?
- C++错误:"error: int aaa::bbb is protected within this context"
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- Is !NaN not a NaN?
- Directx 11 - CompileFromFile() is not compiling
- Centos7 g++ "to_string is not in a member of std"
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- Where is std::hardware_destructive_interference_size?
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 为什么我收到错误:"there is more than one default constructor"?
- Is calloc better than malloc?
- Is ++(a = b); faster than a = b + 1;?
- Is while faster than for?
- Is int faster than long?
- 为什么这段代码会出现"exception spec is more lax than base"错误?
- QuickSort is slower than std::sort
- 继承的构造函数和"explicit is better than implicit"
- is regex faster than if else?
- Is std::mt19937_64 faster than std::mt19937?