Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 编译器优化调用ret vs jmp_C_Linux_Gcc_Compiler Construction - Fatal编程技术网

C 编译器优化调用ret vs jmp

C 编译器优化调用ret vs jmp,c,linux,gcc,compiler-construction,C,Linux,Gcc,Compiler Construction,我正在构建一个项目,正在查看生成的列表文件。(目标:x86-64)我的代码如下所示: int func_1(var1,var2){ asm_inline_( ) func_2(var1,var2); return_1; } void func_2(var_1,var_2){ asm __inline__( ) func_3(); } /**** Jump to kernel ---> Syst

我正在构建一个项目,正在查看生成的列表文件。(目标:x86-64)我的代码如下所示:

int func_1(var1,var2){
       asm_inline_(
       )
       func_2(var1,var2);
       return_1;      
}
void func_2(var_1,var_2){
     asm __inline__(
     )
     func_3();
}
/**** Jump to kernel ---> System call stub in assembly. This func in .S file***/
void func_3(){
}
当我看到汇编代码时,我发现在调用func_2和func_3时使用了“jmp”指令而不是“call return”对。我相信这是一个编译器优化,我还没有探讨如何禁用它。(GCC) 当我向func_2和func_3添加一些可变变量并增加它们时,“jmp”就会被“call ret”对替换。 我对这种行为感到困惑,因为这些变量是无用的,它们没有任何用途。 有人能解释一下这种行为吗


谢谢

如果代码跳转到另一个函数的开头而不是调用它,当跳转到的函数返回时,它将返回到调用外部函数的起点,忽略该点之后的第一个函数。假设行为是正确的(第一个函数在该点之后对执行没有任何贡献),这是一个优化,因为它将指令和堆栈操作的数量减少了一个级别

在给定的示例中,行为是正确的;没有要弹出的本地堆栈,也没有要返回的值,因此没有需要在调用后运行的代码。(
return_1
,假设它不是某个对象的宏,它是一个纯表达式,因此无论其值如何,它都不做任何事情。)因此,当堆栈帧对事件没有更多贡献时,没有理由在将来保留堆栈帧

如果将可变变量添加到函数体中,则不仅仅是添加编译器可以分析其流的变量,而是添加明确告知编译器可以在其可以预测的正常控制流之外访问的插槽。
volatile
限定符警告编译器,即使变量没有明显的转义方式,外部的某些东西也有办法获取它们的地址并随时写入。所以它不能缩短它们的生命周期,因为有人告诉我们,函数外部的代码可能仍然试图写入堆栈空间;显然,这意味着堆栈框架需要在其整个声明生命周期内继续存在