使用类似的东西是否有任何性能差异
for(int i = 0; i < 10; i++) { ... }
Run Code Online (Sandbox Code Playgroud)
和
for(int i = 0; i < 10; ++i) { ... }
Run Code Online (Sandbox Code Playgroud)
或者编译器是否能够以这样的方式进行优化,使它们在功能相同的情况下同样快速?
编辑:这是因为我与同事讨论过这个问题,并不是因为我觉得它在任何实际意义上都是有用的优化.它主要是学术性的.
在 C/C++ 中,
复合赋值运算符将简单赋值运算符与另一个二元运算符组合在一起。复合赋值运算符执行附加运算符指定的操作,然后将结果分配给左操作数。例如,复合赋值表达式,如
expression1 += expression2可以理解为
expression1 = expression1 + expression2然而,复合赋值表达式并不等同于扩展版本,因为复合赋值表达式只计算 expression1 一次,而扩展版本计算 expression1 两次:在加法运算和赋值运算中。
(引自Microsoft Docs)
例如:
i+=2;,i将直接修改而不创建任何新对象。i=i+2;,i首先会创建一个副本。复制的一个将被修改,然后被分配回i. i_copied = i;
i_copied += 2;
i = i_copied;
Run Code Online (Sandbox Code Playgroud)
如果没有编译器的任何优化,第二种方法将构造一个无用的实例,从而降低性能。
在 C# 中,+=不允许重载类似运算符。并且所有像or一样的简单类型都声明为(这是否意味着 C# 中的所有结构实际上都是不可变的?)。intdoublereadonly struct
我不知道在C#,是有一定的表达力对象被修改(至少对于简单类型)直接,而不被创建的任何无用实例。
而且,是否有可能在C#-compiler优化表达x=x+y到x+=y不如预期,如果有一个从构造函数和deconstructors无副作用。