"x += y" FLOP 计数与 "x = x + y"

FLOP count of "x += y" vs. "x = x + y"

本文关键字:FLOP      更新时间:2023-10-16

在像C++这样的语言中,有一个像x += y这样的表达式。

如果x已经被特定的浮点数占用(例如3.0),以下两者之间是否有任何 FLOP 计数差异?

    1. x += 1.0
    1. x = x + 1.0

编辑

具体来说,在Python等语言中,确实存在差异

  • x+= 1.0
  • x = x+1.0

其中第一个表示数据结构本身的修改,第二个对应于变量的重新分配。(参考:for 循环中的 i=i+1 和 i+=1 有什么区别?

对于FLOP计数,人们可能对以下两件事感兴趣:

  • +S 的数量
  • *s 的数量

因此,新手像我一样C++想知道两者的 FLOP 计数之间的差异可能是很自然的。

正如回答者指出的那样,当我们使用volatile对象时,即使在C++中,差异也会显现出来。

C 和 C++ 没有说明任何关于 CPU 操作的信息。这两种语言都指定表达式的行为,而不是它们的实现方式。

x = x + 1.0x += 1.0的行为是相同的,只是评估x的任何副作用在前者中发生两次,在后者中发生一次。如果x是非volatile对象的名称,那么就没有语义差异,任何像样的编译器都应该为两者生成完全相同的代码。

如果您编写以下内容,则可能会出现差异:

arr[func()] = arr[func()] + 1.0;

arr[func()] ++;