加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

堆栈上的运行时内存分配

发布时间:2020-12-16 03:36:40 所属栏目:百科 来源:网络整理
导读:我想了解堆栈区域上的运行时内存分配以及它与堆区域中运行时内存分配的区别. 我知道如何使用库函数分配内存. #includealloca.h void *alloca(size_t size); //(for runtime memory on stack)#includestdlib.h void *malloc(size_t size); //(for run time me
我想了解堆栈区域上的运行时内存分配以及它与堆区域中运行时内存分配的区别.

我知道如何使用库函数分配内存.

#include<alloca.h> void *alloca(size_t size); //(for runtime memory on stack)

#include<stdlib.h> void *malloc(size_t size); //(for run time memory on heap)

我也知道,如果我们使用alloca函数,我们不需要明确释放该内存,因为它与堆栈相关联,它会自动释放.

我想知道哪些系统调用与alloc和malloc相关联,以及它们在两者中的工作原理.

解决方法

总之,他们通常不使用系统调用,除非可用的内存不足.

对于这两个人来说,救主是不同的,所以我解释不同.

的malloc

假设你的程序最初有1MB(例如)可用的内存分配. malloc是一个(标准)库函数,它占用1MB,查看要分配的内存,将1MB的一部分删除并提供给您.对于记账,它保留了未分配记忆的链表.然后,自由函数会将该块释放到空闲列表中,从而有效地释放内存(即使操作系统仍然无法恢复),除非自由决定你有太多的内存,操作系统).

只有当用完1MB时,malloc才会要求操作系统有更多的内存.系统调用本身依赖于平台.你可以看看this answer.

ALLOCA

这不是一个标准函数,它可以以各种方式实现,没有一个可能会调用任何系统函数(除非它们足够好以增加堆栈大小,但是你永远不会知道).

什么alloca(或等价地(C99)标准可变长度数组(VLA)做)是通过调整适当的寄存器来增加当前函数的堆栈帧(例如x86中的esp).任何恰好位于同一个堆栈框架上但位于可变长度数组(或分配的存储器)之后的变量然后将通过ebp size_of_vla常量来代替,而不是旧的简单的ebp常数.

由于堆栈指针在函数返回时(或通常在任何{}块的退出时)恢复到先前函数的帧,所以分配的堆栈内存将被自动释放.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读