堆栈上的运行时内存分配

Tiw*_*ari 10 c

我想知道堆栈区域上的运行时内存分配以及它与堆区域上的运行时内存分配的不同之处.

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

#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)
Run Code Online (Sandbox Code Playgroud)

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

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

Sha*_*baz 12

简而言之,除非耗尽可用内存,否则它们通常不会使用系统调用.

这两种行为都不同,所以我的解释不同.

的malloc

假设您的程序最初有1MB(例如)可用内存用于分配.malloc是一个(标准)库函数,占用这个1MB,查看你想要分配的内存,削减1MB的一部分,并给你.对于簿记,它保留了未分配记忆的链接列表.free然后该函数将释放的块添加回空闲列表,有效地释放内存(即使操作系统仍然没有获得任何free内存,除非确定您有太多内存并实际将其返回给操作系统).

只有当你的1MB用完时才malloc真正要求操作系统获得更多内存.系统调用本身与平台有关.例如,您可以查看此答案.

ALLOCA

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

什么alloca呢(或等效的(C99)的标准可变长度数组(VLA)做)是由(例如调整适当的寄存器,以增加当前函数的堆栈帧esp中的x86).任何碰巧位于同一堆栈帧但位于可变长度数组(或allocaed存储器)之后的变量将由ebp + size_of_vla + constant而不是好的旧简单来寻址ebp + constant.

由于在函数返回时(或通常在任何{}块的退出时)堆栈指针被恢复到前一个函数的帧,因此任何堆栈存储器alloca都会被自动释放.