for while 循环 区别 汇编 | for循环与while循环在DEBUG环境下生成的汇编码的区别

for while 循环 区别 汇编

是否有听人讲过for while 循环会差一条汇编语句呢?

是否有人跟你说过while会比for快呢?

for 跟 while 生成的汇编码是否一样呢?

答案是,对,也不对。因为在DEBUG环境下,VS编译器为for 跟 while 循环生成的汇编代码确实有区别,for的确是多了一条跳转语句,但是,这仅仅是DEBUG环境下,在RELEASE版本里面,编译器会做各种优化,而且不同厂商的编译器还有不同的优化策略,所以,除非某人确切告诉你,他是从RELEASE版本下的EXE中逆向工程得到的汇编码里明确看到区别,不然别相信他。而且我猜测,RELEASE版本里不会有区别的(仅仅是我猜测,求大侠拍砖)。

好,那我们来看看DEBUG环境下差别在哪里,为什么会有这差别:

for:

for

while:

while

 

一个简单的,一样的逻辑,分别使用for 和 while 循环,从中我们可以发现,在for循环里,为i赋初值后是一个跳转,跳到判断语句,判断成立做++nSum,再跳回前面做++i,然后再是判断。

 

而while循环,i赋值在外部,开始就是一个判断语句,接着是++nSum,++i,接着是一个跳转回到判断。

 

通过观察可以看出,for循环比while循环多出的一条就是开始为i赋初值后的跳转,而且这句多出的跳转是不在循环体内的,意思是循环不经过这个跳转,循环多少次,for比while多出的也只是一次跳转。所以说快嘛,确实是快(前提是debug下),但快多少嘛,大概就是IP寄存器多了一次变动,估计就是几个时钟周期,真想出不出什么词语能形容这个差别。

 

至于为什么呢?我猜是因为编译器编译for循环时,是检测是否有初始化,然后加上那一段汇编码,然后检测是否有判断条件,是否有每次步进的表达式,然后相应的生成汇编码,最后才到循环体内的代码,所以为了维持这种结构,不得不通过一个跳转来进入循环体。而while就简洁很多了,只需要生成一个判断的汇编码,接着就是循环体的代码,所以可以自动生成更简单,结构更好的汇编码。

 

其实从这里也可以看出一点点软件工程的思想,一旦一个函数功能复杂了,就难免有纠结的地方,要尽量使得一个函数功能单一,简洁。

 

好的,以我现在的能力,只能挖到这么一些东西了,交流,拍砖,灌水,神马的都无任欢迎啊。话说,自己这么写啊写的,居然到现在都没有一个人留言过,悲催啊,是不是太水了?哈哈。

Tagged , , , . Bookmark the permalink.

2 Responses to for while 循环 区别 汇编 | for循环与while循环在DEBUG环境下生成的汇编码的区别

发表评论

邮箱地址不会被公开。