从函数c ++返回值的幕后花絮

Dar*_*lyn 7 c++ function

在c ++中从函数返回值的幕后是什么?

在我的理解中每当func.被称为返回地址和堆栈帧(具有局部变量,func.参数和寄存器的被调用顺序)被推送到调用堆栈.

但是当执行遇到返回statemenet时会发生什么?例如

int a( int b ){
   int c = b * 2;
   return c;
}
Run Code Online (Sandbox Code Playgroud)

遇到return语句后,存储在EAX寄存器中的C值是否被破坏,局部变量被破坏,堆栈帧从调用堆栈中删除,之后EAX寄存器中的值被移入"返回地址"内存?

或者我误解了这个概念?

所有帮助都非常感谢.谢谢.

Tho*_*ews 4

顺便说一句,汇编语言依赖于处理器。ARM 处理器没有 EAX 寄存器。

编译器可能有传递参数和返回参数的标准。从函数返回值的方法取决于实现(编译器)。所有编译器都没有统一的标准。

未优化的代码
编译器旨在利用处理器寄存器。

如果返回值适合单个寄存器,则将使用寄存器来返回该值。取决于处理器。

对于较大的对象/值,编译器有两种选择:在多个寄存器中返回对象或返回指向该值的指针。指针可以像堆栈中的索引或值所在的地址一样简单。

优化代码
编译器可能会用简单的处理器指令替换您的函数,甚至删除代码。在这种情况下,没有返回值。

编译器可能会将您的函数计算为常量,并将该常量放入可执行代码中;因此不需要函数调用或函数返回。

编译器可能决定内联您的函数。在这种情况下,没有返回值,类似于赋值语句。临时变量可用于包含值或另一个寄存器。

更多信息
有关更详细的信息,请研究“编译器理论”。有一本好书,上面有一条龙......