zoukankan      html  css  js  c++  java
  • 内存之栈与调用管理

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

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

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

  • 相关阅读:
    docker部署Nginx
    docker的常用命令
    centos上安装docker
    springcloud负载均衡及Ribbon
    maven下载私服jar
    spring security异常处理的三种方式
    spring security权限控制
    北京理工大学复试上机--2001A
    北京理工大学复试上机--2000
    PAT1067 试密码 (20分)——测试点4分析 一个易错点
  • 原文地址:https://www.cnblogs.com/cdwodm/p/2921338.html
Copyright © 2011-2022 走看看