内存之栈与调用管理

原本以为栈就那回事,存放一下临时变量,参与一下函数的调用,但是今天看《程序员的自我修养》又让我对栈加深了了解

我这里只想说下我不知道的,至于那些调用惯例我就不多说了,理解起来不是很难

除了参数的传递之外,函数与调用方的几哦啊胡还有一个渠道就是返回值,eax是传递返回值的同道,但是eax本身只有4字节,大于4字节的采用edx和eax做返回值,而对于超过8字节的返回类型参照下面的例子

 1 typedef struct big_thing
 2 {
 3     char buf[128];
 4 }big_thing;
 5 
 6 big_thing return_test()
 7 {
 8     big_thing b;
 9     b.buf[0]=0;
10     return b;
11 }
12 
13 int main()
14 {
15     big_thing n=return_test();
16     return 0;
17 }

首先main函数在栈上额外开辟了一片空间,并将这块空间的一部分作为传递返回值的临时对象,这里称之为temp

将temp对象的地址作为隐含参数传递给return_test()

return_test()将数据拷贝给temp对象,并将temp对象的地址用eax传出

return_test()返回之后,main函数将eax指向的temp对象的内容拷贝给n

综上所述,上述过程拷贝了两次,如果是c++类的话,在这个过程中构造函数会执行两次。

原文地址:https://www.cnblogs.com/cdwodm/p/2921338.html