今天看到有人提问,C语言中return是return到哪里,感觉这个问题很有意思,故除了回答之外,顺便写篇文章(内容上是相同的)。
先说结论:
返回给逻辑上的主调方。如果指的是返回到寄存器还是哪个主存单元,则答案是不能确定,取决于具体情况(主要是编译器具体策略)。
“逻辑中的主调方”并非专有名词。但要明白一点:主调方caller和被调方callee都只是逻辑上的控制流程, 不一定真正形成子流程结构。
C语言中的控制流和函数
C中的函数被编译为中间代码,再从中间代码生成机器的目标码。这个过程相当复杂,具体涉及编译原理,我们不展开叙述。从中间代码生成目标代码的过程与机器本身高度相关,我们按下不表,主要看生成中间代码的过程,这一部分才是涉及到控制流逻辑核心的部分。
控制流(Control Flow)可以理解为计算机中,程序从入口点(Entry)开始的程序执行流,顺序结构的控制流是一路向下不回头的,分支结构每次执行时控制流根据条件前往其中一个分支,循环结构可以将控制流导回之前的部分,流图表现为成环。C语言代码生成中间代码时,函数一般会形成符号(Symbol)(但有时不会。声明和定义通常都会产生符号),以及和符号对应的生成代码(只有定义会产生生成代码,声明则不会),写入符号表等表格。这也是C语言分单元编译链接的理论基础。
在典型的函数控制流中,一个典型的函数会被单独抽出来:
int foo(int a) {
// 假定a通过AX传入
return calc(a); // 假定calc是一个通过AX寄存器传参的外部函数