荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: scanf (carefully), 信区: Visual
标 题: Visual与GCC的比较[zz]
发信站: 荔园晨风BBS站 (Thu Oct 23 22:43:19 2003), 站内信件
我与别人讨论两段程序
先看看微软的Visual C/C++:
char ch = 0xff;
if ( ch == 0xff )
{
// 不会执行
..
}
查看比较语句的的汇编码为cmp ebx, 0ffh ,机器码为 81 fa ff 00 00 00
而
char ch = 0xff;
if ( ch == (char)0xff )
{
// 会执行
..
}
比较语句的汇编码为cmp ebx, 0ffh ,机器码为 83 fa ff
该死的微软。居然显示给我的汇编码是一样的。
我们用GCC来测试:
第一段:编译有个warning,说什么比较那一行永远为假,因为数据类型宽度限制之类的
话,结果变成:
movb $-1, -1(%ebp)
这、这、太厉害了!
第二段:
movb $-1, -1(%ebp)
cmpb $-1, -1(%ebp)
jne .L3
leal -1(%ebp), %eax
incb (%eax)
.L3:
结论:GCC要比什么烂烂的Visual C/C++强一百倍。
GCC的优化太神了点!
看下面这段代码:
int add(int x, int y)
{
return (x+y);
}
int main(void)
{
int i =1, j =1;
int k;
k = add(i, j);
}
用gcc 不加优化编译:main过程为:
main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl $1, -4(%ebp)
movl $1, -8(%ebp)
subl $8, %esp
pushl -8(%ebp)
pushl -4(%ebp)
call add
addl $16, %esp
movl %eax, %eax
movl %eax, -12(%ebp)
leave
ret
用gcc -O 编译:main过程没变。
那用gcc -O2呢:
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
pushl $1
pushl $1
call add
leave
ret
不错!再接再厉,用gcc -O3:
main:
pushl %ebp
movl %esp, %ebp
popl %ebp
ret
才到O3,我还没试到O9呢..........!!!!!
--
→我:(打劫内裤,快脱,不然,老子毙了你!)
看 ● ○ ╮╮ 看
↓ █┳ ┗█┛ \█/ 我倒!~~↓
面 ┏┓ ┛┗ ● 面
→你:(大哥,我今天没穿啊,不要~不要啊!)
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.36.110]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店