【发布时间】:2021-10-22 01:24:11
【问题描述】:
我浏览了链接What is the difference between exit and return? 和 return statement vs exit() in main() 去寻找答案,却徒劳无功。
第一个链接的问题是答案假定return 来自任何函数。我想知道在 main() 函数中两者之间的确切区别。即使有一点不同,我也想知道它是什么。哪个是首选,为什么?在关闭各种编译器优化的情况下,使用 return 而不是 exit()(或 exit() 而不是 return)是否有任何性能提升?
第二个链接的问题是我对知道 C++ 中发生的事情不感兴趣。我想要专门针对 C 的答案。
编辑: 在一个人的推荐下,我实际上尝试比较了以下程序的汇编输出:
注意:使用gcc -S <myprogram>.c
程序 mainf.c:
int main(void){
return 0;
}
汇编输出:
.file "mainf.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 4.9.2-10ubuntu13) 4.9.2"
.section .note.GNU-stack,"",@progbits
程序 mainf1.c:
#include <stdlib.h>
int main(void){
exit(0);
}
汇编输出:
.file "mainf1.c"
.text
.globl main
.type main, @function
main:
.LFB2:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $0, %edi
call exit
.cfi_endproc
.LFE2:
.size main, .-main
.ident "GCC: (Ubuntu 4.9.2-10ubuntu13) 4.9.2"
.section .note.GNU-stack,"",@progbits
注意到我并不精通汇编,我可以看到两个程序之间的一些差异,exit() 版本比return 版本短。有什么区别?
【问题讨论】:
-
This answer 第一个问题似乎合适,不是吗?
-
您是否阅读了第二个问题的其他答案?他们中的一些人专门谈论 C。
-
您是在寻找符合 C 标准的答案,还是对事物的指令级别(内核代码、二进制结构等)感兴趣?
-
事物的指令级别。
标签: c