其他
你真的知道C语言函数调用的内幕吗?
点击左上方蓝色“混说Linux”,选择“设为星标”
1
C语言使用函数调用,我们再熟悉不过了,但是函数调用在内存中究竟发生了什么真的清楚吗?只有搞清楚内存里的内幕,才算完全搞懂函数的调用。
这里涉及一个知识点:栈。不管是函数执行还是函数调用,一定要开辟一段内存空间,这块空间就是栈。
栈是一种“后进先出(FILO)”的逻辑结构,比如一堆碗,最先洗完的碗放在最下面,最后洗完的在最上面,吃饭的时候从最上面开始拿。最上面的碗我们称之为栈顶,最底下的碗我们称之为栈底,在内存中栈顶是低地址,栈底是高地址。这里我们可以发现,根据碗的堆叠顺序知道栈是从高地址往低地址分配内存的,与其它的内存地址从低到高分配内存有所不同。
废话不多说,来看一张函数调用的图:
总结几点比较重要的:
向被调用函数传递参数,参数从右往左依次push到栈中;
保存函数的非静态局部变量;
返回函数的返回值
保存上下文的环境,保留之前的数据,比如:返回地址、寄存器的值等,这些值会被存到栈中。
四、一个程序的栈是由若干段函数的栈帧组成的,栈帧的长度取决于对应函数的局部变量的个数和类型,因此,在开发的时候,我们应尽量不要定义太大、太多的局部变量,占用内存太大的数据考虑使用堆内存。
最后,如果搞懂了函数调用背后的原理(当然其实还有很多细节),遇到问题的时候才能做到从容不迫。
往期推荐
来都来了,点个在看再走吧~~~