面试题: C++ 函数调用的原理是什么?什么是栈帧?

C++ 函数调用的原理

在C++中,函数调用的原理涉及以下几个关键步骤:

  1. 参数传递
    • 调用函数时,参数按顺序压入栈中(从右到左或从左到右,取决于调用约定)。
    • 如果参数是对象,可能会调用拷贝构造函数。
  2. 返回地址
    • 将函数调用后的下一条指令地址(返回地址)压入栈中,以便函数执行完毕后能回到调用点。
  3. 栈帧创建
    • 为被调用函数创建一个新的栈帧,包含局部变量、临时变量等。
    • 栈帧还保存调用函数的栈帧指针(基址指针),以便函数返回时恢复调用函数的栈帧。
  4. 函数执行
    • 使用栈帧中的局部变量和参数执行函数代码。
  5. 返回值
    • 返回值通常通过寄存器(如EAX)或栈返回给调用者。
  6. 栈帧销毁
    • 函数执行完毕后,栈帧被销毁,局部变量和参数从栈中弹出。
    • 恢复调用函数的栈帧,跳转到返回地址继续执行。

栈帧(Stack Frame)

栈帧是函数调用时在栈上分配的一块内存区域,包含以下内容:

  1. 局部变量:函数内部定义的变量。
  2. 参数:传递给函数的参数。
  3. 返回地址:函数执行完毕后返回的地址。
  4. 调用函数的栈帧指针:用于恢复调用函数的栈帧。
  5. 临时变量:函数执行过程中使用的临时数据。

栈帧的管理由编译器和硬件共同完成,栈指针(SP)和基址指针(BP)用于跟踪栈帧的位置。

示例

int add(int a, int b) {
    int result = a + b;
    return result;
}

int main() {
    int x = 5, y = 10;
    int sum = add(x, y);
    return 0;
}
  • main调用add时,参数xy压入栈。
  • add的返回地址压入栈。
  • 创建add的栈帧,包含局部变量result
  • add执行完毕后,返回值通过寄存器返回,栈帧销毁,控制权回到main

总结

  • 函数调用涉及参数传递、返回地址压栈、栈帧创建、函数执行、返回值和栈帧销毁。
  • 栈帧是函数调用的核心数据结构,包含局部变量、参数、返回地址等信息。
THE END
点赞7 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容