Rob*_*rtS 0 c c++ memory increment variable-assignment
我真正关心的是++i;,i = i + 1; 和的表达式是否i += 1;彼此等价百分之一百,如果i之前定义。
++i;-i被立即递增1的语句中,而不是i++;在incremetation通过1表达后完成。i = i + 1;-在语句中i立即增加1。i += 1;-在语句中i立即增加1。这些表达式之间是否存在*任何类型的差异,或者它们是否 100% 等效?
*“任何”可能指语法和语义,但也指性能和内存管理。
在C中,i = i+1并且i += 1如果是不等效i是原子类型,因为该化合物分配是用读-修改-写操作memory_order_seq_cst的语义,的每个C 2018 6.5.16.2 3.我还不能说C标准是上的语义完全清楚i = i+1以及i += 1关于 volatile 对象。否则,++i,i = i+1和i += 1是等价的,因为它i只是一个标识符,而不是任何更复杂表达式的占位符。
在 C++ 中,这些操作是不等价的。证明:
这个程序:
#include <iostream>
class SensitiveToOperations
{
public:
SensitiveToOperations operator ++() { std::cout << "Preincrement.\n"; return *this; }
SensitiveToOperations operator +(int that) const { std::cout << "Addition.\n"; return *this; }
SensitiveToOperations operator =(SensitiveToOperations that) { std::cout << "Assignment.\n"; return *this; }
SensitiveToOperations operator +=(int that) { std::cout << "AdditionAssignment.\n"; return *this; }
};
int main(void)
{
SensitiveToOperations i;
++i;
i = i + 1;
i += 1;
}
Run Code Online (Sandbox Code Playgroud)
产生这个输出:
预增量。 添加。 任务。 加法赋值。
从而表明不同的操作可能会得到不同的结果。
对于基本类型,操作可能在很大程度上是等效的,但我没有资格谈论 C++ 语义关于原子或易失性。