内存之栈与调用管理

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

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

除了参数的传递之外,函数与调用方的几哦啊胡还有一个渠道就是返回值,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++类的话,在这个过程中构造函数会执行两次。

你可能感兴趣的:(内存)