在main函式中,return和exit經常混用,兩者的乙個區別:return會執行statck unwinding,而exit不會。如果觸發了訊號,exit也同樣不會做stack unwinding,除此之外異常如果沒有相應的catch,也同樣不會有棧展開(stack unwinding)。
原因是c++編譯器只會在遇到「}」或「return」時,才會安插棧展開**,對於exit等則沒這回事。
#include
#include
#include
class x
~x()
private:
int _m;
};intmain()
以上述**為例,通過彙編,可很容易看出這兩者的區別:
1)return**
intmain()
反彙編main函式,可以看到有呼叫~x:
0x08048474 <main+0>: lea 0x4(%esp),%ecx
0x08048478 : and $0xfffffff0,%esp
0x0804847b : pushl 0xfffffffc(%ecx)
0x0804847e : push %ebp
0x0804847f : mov %esp,%ebp
0x08048481 : push %ebx
0x08048482 : push %ecx
0x08048483 : sub $0x20,%esp
0x08048486 : movl $0x1,0x4(%esp)
0x0804848e : lea 0xfffffff4(%ebp),%eax
0x08048491 : mov %eax,(%esp)
0x08048494 :call 0x80484b6
0x08048499 : mov $0x0,%ebx
0x0804849e : lea 0xfffffff4(%ebp),%eax
0x080484a1 : mov %eax,(%esp)
0x080484a4 : call 0x80484da <~x>
0x080484a9 : mov %ebx,%eax
0x080484ab : add $0x20,%esp
0x080484ae : pop %ecx
0x080484af : pop %ebx
0x080484b0 : pop %ebp
0x080484b1 : lea 0xfffffffc(%ecx),%esp
0x080484b4 :ret
2)exit**
intmain()
反彙編main函式,可以看到沒有呼叫~x:
0x080484a4 <main+0>: lea 0x4(%esp),%ecx
0x080484a8 : and $0xfffffff0,%esp
0x080484ab : pushl 0xfffffffc(%ecx)
0x080484ae : push %ebp
0x080484af : mov %esp,%ebp
0x080484b1 : push %ecx
0x080484b2 : sub $0x24,%esp
0x080484b5 : movl $0x1,0x4(%esp)
0x080484bd : lea 0xfffffff8(%ebp),%eax
0x080484c0 : mov %eax,(%esp)
0x080484c3 :call 0x80484d4
0x080484c8 : movl $0x0,(%esp)
0x080484cf :call0x80483c8 <exit@plt>
附:彙編指令
call指令
分兩步:
1) 將當前的ip或cs和ip壓入棧中
2) 轉移(能實現短轉移,它的書寫格式同jmp指令)
ret指令
相當於pop ip
retf指令
相當於:
1) pop ip
2) pop cs
lea指令
把運算元oprd的偏移位址傳送到暫存器reg,語法:lea reg, oprd
Oracle 中Return 和exit的區別
在oracle儲存過程中,使用return 時,如果執行到return語句,會跳出整個語句 如果是迴圈,會跳出整個迴圈 將不再執行,也就是結束了整個儲存過程。create or replace procedure pro emp1 v eno in number,v resultcode out n...
php中return和exit的區別
ps 本人親測,阿里雲2核4g5m的伺服器價效比很高,新使用者一塊多一天,老使用者三塊多一天,最高可以買三年,感興趣的可以戳一下 阿里雲折扣伺服器 exit 是停止程式執行,不輸出內容 return 是返回值,跳出函式,但不停止程式執行 補充 一下,exit 後面 加個 也是可以輸出內容的!retu...
Shell中exit和return的區別
1.exit關鍵字 exit命令是shell內建命令,用於退出當前shell程序。可以指定退出狀態n,n的取值範圍是0 255,一般情況下,0表示正常退出,非零表示異常退出。如果狀態碼是0 255之外的數值,則會被強制轉換為uint8 t型別的數值,比如 1會被轉換為255,256會發生型別寬度截斷...