希赛考试网
首页 > 软考 > 系统架构设计师

被调函数调用结束后返回到哪

希赛网 2023-11-17 08:10:32

在程序设计中,一个函数被调用后,必定会执行完其中的语句,然后将返回值返回到调用函数中。那么,函数调用结束后会返回到哪里呢?本文将从多个角度进行分析。

1. 函数调用栈

在程序执行时,函数之间的调用关系是通过函数调用栈来维护的。每当一个函数被调用时,它的返回地址和一些参数会被压入调用栈中。函数执行过程中,局部变量和临时变量都会在栈帧中分配空间。当函数执行完毕后,栈帧会被弹出,返回地址会被取出,程序就会从该地址继续执行。因此,函数调用结束后会返回到调用函数的下一条指令处。

2. 操作系统层面

在操作系统层面,每个线程都有自己的栈,用于存储函数调用栈。当进程启动时,操作系统会为其分配内存空间,其中包含了栈空间。每当一个线程被创建时,操作系统会为其分配一个新的栈。因此,函数调用结束后会返回到线程栈的顶部,等待下一条指令的执行。

3. 汇编语言层面

在汇编语言中,函数的调用与返回是通过一组指令来实现的。在 x86 架构中,CALL 指令用于调用函数,它将函数的返回地址压入栈中,然后跳转到函数的入口地址。RET 指令用于函数返回,它会取出栈中的返回地址,然后跳转到该地址继续执行。

4. C++ 中的堆栈与堆

在 C++ 中,大多数的变量都是在函数的栈帧中分配的。函数调用结束后,栈帧会被弹出,分配的空间也会被释放。但是,如果在函数中使用了 new、malloc 等分配内存的操作,所分配的空间就位于堆中。堆是由操作系统分配的内存空间,程序可以在堆中动态分配内存。当程序调用完分配内存的函数后,返回到调用函数中,堆中分配的空间并不会自动释放,需要手动调用 delete、free 等函数来释放,否则会导致内存泄漏。

综上所述,函数调用结束后会返回到调用函数的下一条指令处,同时在操作系统层面上,程序会返回到线程栈的顶部等待下一条指令的执行。在汇编语言层面上,函数的调用与返回都是通过一组指令来实现的。同时,在 C++ 中,使用堆来分配内存时需要手动释放,否则会导致内存泄漏。

系统架构设计师 资料下载
备考资料包大放送!涵盖报考指南、考情深度解析、知识点全面梳理、思维导图等,免费领取,助你备考无忧!
立即下载
系统架构设计师 历年真题
汇聚经典真题,展现考试脉络。精准覆盖考点,助您深入备考。细致解析,助您查漏补缺。
立即做题

软考资格查询系统

扫一扫,自助查询报考条件