C# 推荐什么++;或+;1个在C和x2B中+;?

C# 推荐什么++;或+;1个在C和x2B中+;?,c#,c++,c++11,visual-c++,C#,C++,C++11,Visual C++,S++或S=S+1,建议将值增加1,为什么 我认为应该首选S++,因为它在内部是单机指令(INC)。如果我错了,就纠正我。另一方面,我认为两者是相同的,除了++是一元数,它的后增量和运算符重载对于两者都是不同的 在C++中有什么区别吗?C++两者都有。 预增量运算符通常比前面回答的更快。 (主要是因为编译器可以更好地对其进行优化,并且不需要返回旧值的临时副本)。您不应该尝试进行如此微小的优化。现代编译器足够聪明,可以为几乎所有情况下的所有3个选项(++i,i+=1,i=i+1)生成相同的汇编代码

S++
S=S+1
,建议将值增加1,为什么

我认为应该首选
S++
,因为它在内部是单机指令(INC)。如果我错了,就纠正我。另一方面,我认为两者是相同的,除了
++
是一元数,它的后增量和运算符重载对于两者都是不同的

在C++中有什么区别吗?

C++两者都有。
预增量运算符通常比前面回答的更快。

(主要是因为编译器可以更好地对其进行优化,并且不需要返回旧值的临时副本)。

您不应该尝试进行如此微小的优化。现代编译器足够聪明,可以为几乎所有情况下的所有3个选项(
++i
i+=1
i=i+1
)生成相同的汇编代码

是的,有时您可以获得一些微小的性能提升,例如,使用前缀
++
而不是后缀来处理一些具有非常复杂的
++
运算符的类,但在绝大多数情况下,程序中占用大部分时间的部分并不是增量,因此为了获得一些实际结果,您应该实时分析代码(或接近真实的)测试并找到效率较低的常用代码段

还有一个更重要的事情要考虑,那就是代码可读性。在绝大多数情况下,它比性能更重要,只有在最关键的代码片段中,我们才能牺牲可读性来实现性能(甚至在那里,并不总是如此!有时最好只添加更多的硬件)。


因此,我的建议是使用最清晰地陈述您想法的选项

在过去的好日子里,这类事情起了很大的作用。我过去经常查看生成的机器代码,然后调整C源代码以获得额外10%的速度提升

不再是了。你无法通过查看机器代码来预测速度

  • 现在的许多优化都是在CPU中完成的
  • IL代码在运行时针对其运行的处理器再次进行优化,因此作为开发人员,您永远看不到执行的指令
  • CPU速度如此之快,几乎不重要
您可以尝试测试不同的递增方式,看看哪一种更快。一旦您对此感到厌倦,就不要再担心速度,集中精力编写清晰、无错误的代码。

++更强大。 你可以这样做

if(a++ > 7) b=0;

在通过s=s+1或s++增加变量s之间,我们首先需要接受操作本身是非常基本、简单和直接的。我们基本上是将存储在变量中的值增加一个固定的数字。尽管s++比s=s+1执行得更快,但这两种不同方法之间的时间差ods将是相同的。 我尝试了以下代码:

    int s = 1;
    s++;
它给出了以下编译和执行时间:

编译时间:0.32秒,绝对运行时间:0.14秒,cpu时间:0秒,内存峰值:3 Mb,绝对服务时间:0,46秒

之后,我尝试了以下代码:

    int s = 1;
    s = s + 1;
它给出了以下执行时间:

编译时间:0.32秒,绝对运行时间:0.14秒,cpu时间:0秒,内存峰值:3 Mb,绝对服务时间:0,46秒


所以,正如我所说,这两个操作之间没有显著的区别,因为它们本身非常简单。确实存在时间差;但是,上面给出的执行时间不是很具体,这意味着必须存在大于0.001的时间差,这几乎可以忽略不计。希望这能回答您的问题。

不要不要忘记上面提到的
S++=1
任何一个。如果你想将一个值增加
1
并且不关心前面的值,请使用
++S
。老实说,我只在
中为
循环使用
++
操作符,而在几乎任何其他情况下使用
++
操作符(在这两种语言中,即使我主要使用C#).在几乎所有应用程序中,这不会成为瓶颈,因此我不关心这种“优化”。但我确实关心可读性。为什么?因为这正是您想要传达的确切语义。@PaulF:在调试生成中使用调试器是最有价值的。调试生成通常会禁用优化,因此您将看不到最终发布的代码。此外,您应该首先优化可读性,并处理以下问题:性能,何时何地重要。但如果我对某些复杂的数据类型执行此操作,它将影响性能。@viveknuna是的,如果这涉及热路径,即在应用程序生命周期中执行最多的代码部分time@viveknuna:如果对数据类型执行此操作,则定义其自己的增量运算符,您可以无论如何,不要将
++S
S=S+1
进行对比。它们可能会做不同的事情,后者甚至可能不合法。有人能用机器指令解释一下吗?@ChuckWalbourn你说得对,还有许多静态代码分析器警告说,如果迭代器通过前缀
++
。在混淆代码方面更强大。这不是一个理想的目标。如果您在启用优化的情况下编译,不断传播将使两者等效于
int s=2;
(如果您不使用它做任何其他操作,则将其优化掉)。如果您在禁用优化的情况下编译,则结果将毫无意义(可能是内存中循环计数器的延迟造成瓶颈,而不是这些语句发出的任何asm).使用
-O0
进行基准测试,不能深入了解
-O3
的性能,对于这样的微观优化问题..这只适用于具有重载增量运算符的类类型,这些运算符不能完全内联并优化任何copyi