能力值:
( LV4,RANK:50 )
|
-
-
2 楼
在VC里直接你进入调试模式就可以看到对应的汇编代码了
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
但是那是反汇编出来的代码,还是就是VC对应的汇编代码?
我尝试
#include <iostream.h>
void main()
{
int a;
a++;
++a;
cout<<"Finsh"<<endl;
}
用OD OllyIce VC反汇编出来的都是
MOV EAX,DWORD PTR SS:[EBP-4]
ADD EAX,1
MOV DWORD PTR SS:[EBP-4],EAX
MOV ECX,DWORD PTR SS:[EBP-4]
ADD ECX,1
MOV DWORD PTR SS:[EBP-4],ECX
然后将VC中的CODE变为
#include <iostream.h>
void main()
{
int a;
a++;
++a;
cout<<"Finsh"<<endl;
}
反汇编出来的还是
MOV EAX,DWORD PTR SS:[EBP-4]
ADD EAX,1
MOV DWORD PTR SS:[EBP-4],EAX
MOV ECX,DWORD PTR SS:[EBP-4]
ADD ECX,1
MOV DWORD PTR SS:[EBP-4],ECX
难道a++与++a一样?
另有人说a++是先复制内容再进行加1,然后复制回去,而++a是直接在原位置执行+1。所以++a比a++要快。真的是这样?我们for的时候多是用i++么?
到底哪个更快??
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
补充一个问题:反汇编出来的代码与VC对应的汇编代码是一回事儿么?
|
能力值:
( LV9,RANK:850 )
|
-
-
5 楼
如果代码写成
i=1;
k=1+(i++);
那么k=2;
如果是
k=1+(++i);
那么k=3
照这样看来,如果最后要看的是i的值,那么在一条表达式内,变化得比较快的应该是++i,因为会先自加一,再进行运算,i++则用i去运算,再自加一!
|
能力值:
( LV9,RANK:850 )
|
-
-
6 楼
]
高级语言中的一个变量根据数据宽度对应相应的内存单元!
|
能力值:
( LV9,RANK:850 )
|
-
-
7 楼
在for循环
比如
for(i=0;i<10;i++)
"()"里有三条表达式,对于楼主的问题,我们关注第三条"i++"
这是独立的一条语句,所以,无论i++或++i,i都会自加一,
看反汇编出来的代码:
MOV EAX,DWORD PTR SS:[EBP-4] //eax=i
ADD EAX,1 //eax<-eax+1
MOV DWORD PTR SS:[EBP-4],EAX //i=eax
MOV ECX,DWORD PTR SS:[EBP-4]
ADD ECX,1 //ps:这里和上面一样
MOV DWORD PTR SS:[EBP-4],ECX
一样的
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
[QUOTE=大菜一号;348890]如果代码写成
因为会先自加一,再进行运算,i++则用i去运算,再自加一QUOTE]
也就是说:i++与++i执行的速度是一样的都是各经过一次加一与参与运算,两者的区别只在于参与其他运算的时候的执行的顺序是不一样的?
如果从概念上讲我比较赞同此说法,但如果从汇编上,甚至机器码上看对于不参与其他运算的i++与++i的执行有区别么?
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
不太懂哦? 希望可以说的详细点儿
|
能力值:
( LV9,RANK:850 )
|
-
-
10 楼
没有任何区别`
汇编代码反映出cpu的运算过程,最容易看出了!
你看反汇编出来的代码就知道,i++和++i,除了中间使用的寄存器不一样之外,没啥不同,使用寄存器比直接访问内存可快多了
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
我可不可以这样理解?
对于i++与++i两者执行的速度是一样的,因为二者对应的汇编代码只是执行的顺序不同。但在参与其他运算的时候,++i比i++先完成运算。
对否?
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
不对吧,i++与++i使用的寄存器没有什么不同,当i++在前时,或++i在前时 都是先使用EAX寄存器。
|
能力值:
( LV9,RANK:850 )
|
-
-
13 楼
定义变量,等于叫操作系统为本程序开辟内存空间
一个byte类型,就是一个字节单元!
i=1; //给i所对应的内存单元赋值1,如 mov byte ptr[xxxxxxx],1
而不系所谓的寄存器,和内存单元不同,这也就是为啥汇编程序比高级语言程序运行效率高的原因!运算在于cpu,说白了,cpu拥有自家的饭碗,就是寄存器,如果让cpu,跨过一条数据总线去访问内存,和cpu直接在自家操作自家的饭碗相比,你说哪个快!
|
能力值:
( LV9,RANK:850 )
|
-
-
14 楼
++i比i++先完成自已本身的运算
|
能力值:
( LV9,RANK:850 )
|
-
-
15 楼
那eax和ecx有啥不同,名字不同而已
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
如果不参与其他的运算只是像我代码中的
#include <iostream.h>
void main()
{
int a;
a++;
++a;
cout<<"Finsh"<<endl;
}
两者执行速度或者说执行耗时是不是一样的?
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
似乎有资料称EAX比ECX执行速度更快,所以编程时优先考了EAX
|
能力值:
( LV9,RANK:850 )
|
-
-
18 楼
就两条语句来讲是一样的,
不过a++在前面,当然是先执行,哈哈哈哈
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
eax 比 ecx 快...
|
能力值:
( LV9,RANK:850 )
|
-
-
20 楼
哈哈哈,关于这个,我下一秒钟驾着ufo去美国找盖茨问一问
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
我想我没表达清楚,我的意思是:如果我用汇编写代码,想表达与i++相同的代码是不是也是如同反汇编出来的那样,
MOV EAX,DWORD PTR SS:[EBP-4]
ADD EAX,1
MOV DWORD PTR SS:[EBP-4],EAX
走三步,还是有更优化的方法?
|
能力值:
( LV9,RANK:850 )
|
-
-
22 楼
用汇编写代码,直接使用寄存器
inc eax
哈哈哈,一步``哈哈,没必要的时候就不用变量了!
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
找比尔该死问没用,得问“英特儿”小妞
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
耗时,不是执行顺序。执行顺序,包括k=1+(i++);k=1+(++i)我理解
|
能力值:
( LV9,RANK:850 )
|
-
-
25 楼
哦哦,那就应该一样吧!
|
|
|