c语言for循环的省略写法,C语言两种for循环写法分析
每個C程序員都知道同一個for循環(huán)語句可以有兩種寫法:
A:?for?(i?=?0;?i?
B:?for?(i?=?cnt;?i?>?0;?i--){?}
前幾天,DEBUG的時候,?發(fā)現(xiàn)采用A寫法的代碼反匯編出來有BUG.當時沒有時間記錄,環(huán)境也沒有保存下來.今天嘗試重現(xiàn),又沒來出現(xiàn)上次的問題...很奇怪.
很久很久以前也聽說過這兩種寫法有區(qū)別,今天就順便分析一下,也算沒有白忙.
編譯環(huán)境:?mipsisa32-xlr-linux-gcc?3.4.3
測試代碼見附件:?raw_socket.c
A反匯編之后的代碼如下:
B反匯編之后的代碼如下:
對A的分析:
401158:?將?i?清零
40115c:?將?i?的值加載到寄存器?v0
401160:?將?cnt?的值加載到寄存器?v1
401164:?比較?v0?是否小于?v1?即?i?是否小于?cnt.?如果?i?
401168:?如果?v0?的值為?0?即?i?>?cnt,?則跳到?4011a8?地址執(zhí)行,?即跳出?for?循環(huán)
...
4011a0:?跳到?40115c?重新開始?for?循環(huán)
4011a4:?把?v0?即?i?的值寫入內(nèi)存.?由于mips的流水行機制,?在上一條語句真正跳轉(zhuǎn)前,這條語句會被執(zhí)行
對B的分析:
401158:?將?cnt?的值加載到寄存器?v0
40115c:?將?v0?的值賦給?i,?即將?cnt?的值賦給?i
401160:?將?i?的值加載到寄存器?v0?(這一條有必要么?)
401164:?如果?v0?的值小于等于?0,?即?i?<=?0,?則跳到?4011a4?處執(zhí)行,?即跳出?for?循環(huán)
...
40119c:?跳到?401160?地址執(zhí)行,?重新開始?for?循環(huán)
4011a0:??把?v0?即?i?的值寫入內(nèi)存.
通過上面的分析可以看出A要比B多一條語句:?A的401160.?每次for循環(huán),?A都要從內(nèi)存中多加載一次cnt的值.
內(nèi)存的讀取一般遠遠小于CPU的執(zhí)行速度.A的效率應(yīng)該不如B高.
將同樣的代碼,在x86上編譯,反匯編.
系統(tǒng):?Fedora?17?x86
編譯器:?gcc?4.7.2
A寫法的反匯編結(jié)果:
B寫法的反匯編結(jié)果:
A寫法同樣多了對cnt內(nèi)存的讀取...
總結(jié)
以上是生活随笔為你收集整理的c语言for循环的省略写法,C语言两种for循环写法分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Rust——Macos安装使用
- 下一篇: 晓庄学院计算机科学分数,南京晓庄学院计算