linux相关我用 Linux技术文

内存、栈、堆的一点小总结 《程序员的自我修养》·笔记

2015-08-24  本文已影响1546人  popsheng

内存、栈、堆的一点小总结

#include<stdio.h>
typedef struct big_thing
{
  char buf[128];
}big_thing;
big_thing return_test()
{
  big_thing b;
  b.buf[0] = 0;
  return b;
}
int main()
{
  big_thing n = return_test();
  return 0;
}
- 大致解读
    - 首先main函数在栈上额外开辟一片空间,并将这块空间的一部分作为传递返回值的临时对象,这里称为temp;
    - 将temp对象的地址作为隐藏参数传递给return_test函数;
    - return_test函数将数据拷贝给temp对象,并将temp的地址用eax传出;
    - return_test函数返回后,main函数将eax指向的temp对象的内容拷贝给了n。
    
返回值传递流程如下:
![](http://7xl3j2.com1.z0.glb.clouddn.com/cxy-19.jpg)
**【注意】结果返回值对象会被拷贝两次,所以不到万不得已不要返回大尺寸的对象。**
void *malloc(size_t  nbytes)
{
    void *ret = mmap(0,nbytes,PROT_READ | PROT_WRTIE, MAP_PRIVATE | MAP_ANONYMOUS,0,0);
    if(ret == MAP_FAILED)
        return 0;
    return ret;
}
    【需要注意的是】mmap()函数和VirtualAloc()类似,他们都是虚拟空间的申请函数,**它们申请的空间的其实地址和大小必须是系统页的大小的整数倍**。
上一篇下一篇

猜你喜欢

热点阅读