希望这不是太笼统或奇怪的问题.此外,无法在谷歌上找到它,不知道这是否只是一个问题太愚蠢或者我是否在谷歌失败.
所以,我忘了我从哪里读到这个,但是,它说使用'++ 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.唯一的区别是订单(惊讶?).我认为这是相当典型的例子,其中使用了增量语句的值.
jsk*_*ski 10
如果你在这个级别进行优化,那你就是在浪费时间.你的程序肯定会有一些循环变得更快.
好吧,preincrement操作("++ x")在完成增量后返回变量的结果,而后增量操作("x ++")在增量完成之前返回变量的结果.编译器COULD(并强调COULD)使用preincrement更容易优化(因为只有一个值被有效使用;在后增量情况下,有两个值;增量前变量的值和变量的值之后;编译器可能能够优化preincrement以使用包含变量本身的存储.
请注意,这是非常理论化的; 它在很大程度上取决于您的编译器优化.在大多数情况下,并且在大多数情况下,它们实际上都是等效的.
| 归档时间: |
|
| 查看次数: |
1858 次 |
| 最近记录: |