i++和++i

swofford posted @ 2010年9月30日 11:20 in C , 2106 阅读

在 Chito 开发者的一篇日志中,评论下面有人说传说中 ++i 比 i++ 的效率高,看 K&R 的书,上面的自增也是用 ++i,感觉有点好奇,就照葫芦画瓢,按这篇文章中的方法用 gcc 反了一下,却发现两者汇编代码一样……

test.c

#include <stdio.h>

int main(void)
{
	int i;
	
	i = 0;
	i++;

	return 0;
}

test2.c

#include <stdio.h>

int main(void)
{
	int i;
	
	i = 0;
	++i;

	return 0;
}

 

反后的汇编代码

test.s

.file	"test.c"
	.def	___main;	.scl	2;	.type	32;	.endef
	.text
.globl _main
	.def	_main;	.scl	2;	.type	32;	.endef
_main:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$8, %esp
	andl	$-16, %esp
	movl	$0, %eax
	addl	$15, %eax
	addl	$15, %eax
	shrl	$4, %eax
	sall	$4, %eax
	movl	%eax, -8(%ebp)
	movl	-8(%ebp), %eax
	call	__alloca
	call	___main
	movl	$0, -4(%ebp)
	leal	-4(%ebp), %eax
	incl	(%eax)
	movl	$0, %eax
	leave
	ret

 

test2.s

.file	"test.c"
	.def	___main;	.scl	2;	.type	32;	.endef
	.text
.globl _main
	.def	_main;	.scl	2;	.type	32;	.endef
_main:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$8, %esp
	andl	$-16, %esp
	movl	$0, %eax
	addl	$15, %eax
	addl	$15, %eax
	shrl	$4, %eax
	sall	$4, %eax
	movl	%eax, -8(%ebp)
	movl	-8(%ebp), %eax
	call	__alloca
	call	___main
	movl	$0, -4(%ebp)
	leal	-4(%ebp), %eax
	incl	(%eax)
	movl	$0, %eax
	leave
	ret

具体如上了,比较了一下两者,是一样的,难道传说中的 ++i 比 i++ 效率高是假的? ==!!

我的水平很菜,若是有地方错了,欢迎各位指出。

Avatar_small
Garfileo 说:
2010年9月30日 13:18

嗯,赞较真!

那个话是我“传说”的。

不过,你用的例子,自然是看不出效率的。我那个传说,是有语境的。该用 ++i 的时候,如果用 i++,可能会导致代码行增多,所以我说前者效率低。

Avatar_small
Garfileo 说:
2010年9月30日 13:20

@Garfileo: s/前者效率低/前者效率高/g

Avatar_small
Qcf 说:
2010年10月02日 00:41

简单的整数自加这个会被优化掉吧
理论上说i++会产生一个临时变量浪费空间,所以能用++i就用++i吧

Avatar_small
_imfeng 说:
2010年10月05日 11:28

你可以在在看看vc的实现过程,看有无差异

Avatar_small
Kflayca 说:
2010年10月16日 11:07

http://hi.baidu.com/afeiqiang020/blog/item/015f0709f8656084d1581bae.html

//有int参数的表示后置自加
int operator ++ ()
{
return i += 1;
}

int operator ++(int i)
{
int k = i;
i += 1;
return k;
}


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter