荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: 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软件 网络书店