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++类的话,在这个过程中构造函数会执行两次。

  • 相关阅读:
    简单聊聊智能硬件的固件测试
    Regular进阶: 跨组件通信
    项目组建和磨合阶段常见的坑
    从需求到数据到改进,如何形成闭环
    请不要怪罪流程
    自备干货!如何有效的做竞品迭代分析
    css小点心
    java的collection集合
    java中的数组与集合相互转换
    java-增强for循环
  • 原文地址:https://www.cnblogs.com/cdwodm/p/2921338.html
Copyright © 2011-2022 走看看