C 中的return和exit區別

2021-09-10 08:21:23 字數 2607 閱讀 4307

在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會發生型別寬度截斷...