在更优化的C#中,如果这是正确的词:++ x或x ++?

Mas*_*hew 6 c#

完全重复:

在C#中,myint ++和++ myint有什么区别?

希望这不是太笼统或奇怪的问题.此外,无法在谷歌上找到它,不知道这是否只是一个问题太愚蠢或者我是否在谷歌失败.

所以,我忘了我从哪里读到这个,但是,它说使用'++ x'(或其他任何变量)以某种方式更优化或者你可能称之为'x ++'.

那么,这只是看起来还是真的更快?就像,他们做同样的事情,这就是我要问的原因.

Mat*_*hen 23

他们做了不同的事情.第一个是预增量,第二个是后增量.如果您在一条线上单独使用,您将不会注意到差异.但如果你这样做(例如):

a = x++
Run Code Online (Sandbox Code Playgroud)

要么

a = ++x
Run Code Online (Sandbox Code Playgroud)

你会.使用后递增,您将获得值,然后递增.使用预增量,递增,然后获取值.请参阅http://en.wikipedia.org/wiki/++#Use_in_programming_languages以获得简要说明(它们使用JS作为示例,但它同样适用于C#)

编辑:通过流行的需求(并反驳一些夸大其词),这里有一些关于C++原语的性能.以此示例程序为例:

int main()
{
    int a;
    int x = 14, y = 19;
    a = x++;    
    a = ++y;    
}
Run Code Online (Sandbox Code Playgroud)

它在x86上编译(g ++,只是-S)到下面.我删除了不相关的行.让我们看看发生了什么,看看是否有不必要的重复:

        # Obvious initialization.
        movl    $14, -12(%ebp) 
        movl    $19, -16(%ebp)

        movl    -12(%ebp), %eax # This is moving "old x" to the accumulator.
        movl    %eax, -8(%ebp) # Moving accumulator to a.
        addl    $1, -12(%ebp) # Increment x (post-increment).

        addl    $1, -16(%ebp) # Increment y (pre-increment)
        movl    -16(%ebp), %eax # Move "new y" to accumulator.
        movl    %eax, -8(%ebp) # Move accumulator to a.
Run Code Online (Sandbox Code Playgroud)

我们完成了.

如您所见,在此示例中,在每种情况下都需要完全相同的操作.正好2个movl和1个addl.唯一的区别是订单(惊讶?).我认为这是相当典型的例子,其中使用了增量语句的值.

  • 我认为问题是关于性能而不是功能.我想知道为什么Mashew接受了你的答案. (5认同)

jsk*_*ski 10

如果你在这个级别进行优化,那你就是在浪费时间.你的程序肯定会有一些循环变得更快.

  • 一个好点,它传播价值.我怀疑在大多数情况下这会带来明显的速度优势.我还认为,当用高达C#的语言编写时,x ++与++ x是语义的. (2认同)

Pau*_*ier 5

好吧,preincrement操作("++ x")在完成增量后返回变量的结果,而后增量操作("x ++")在增量完成之前返回变量的结果.编译器COULD(并强调COULD)使用preincrement更容易优化(因为只有一个值被有效使用;在后增量情况下,有两个值;增量前变量的值和变量的值之后;编译器可能能够优化preincrement以使用包含变量本身的存储.

请注意,这是非常理论化的; 它在很大程度上取决于您的编译器优化.在大多数情况下,并且在大多数情况下,它们实际上都是等效的.