gpt4 book ai didi

c - 堆栈上的运行时内存分配

转载 作者:太空狗 更新时间:2023-10-29 16:47:42 26 4
gpt4 key购买 nike

我想知道堆栈区域的运行时内存分配及其与堆区域的运行时内存分配有何不同。

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

#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 相关联,以及它们在两者中的工作方式。

最佳答案

简而言之,他们通常不使用系统调用,除非用完可用内存。

两者的行为不同,所以我解释不同。

分配

假设最初您的程序有 1MB(例如)可用内存供分配。 malloc是一个(标准)库函数,它占用这 1MB,查看您要分配的内存,切出 1MB 的一部分并将其提供给您。对于簿记,它保留未分配内存的链表。 free函数然后将被释放的 block 添加回空闲列表,有效地释放内存(即使操作系统仍然没有取回任何内存,除非free决定你有太多的内存内存并实际将其还给操作系统)。

只有当您用完 1MB 时,malloc 才会显示实际上要求操作系统提供更多内存。系统调用本身是平台相关的。你可以看看this answer例如。

分配

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

什么 alloca does(或等同于(C99)标准可变长度数组(VLA)do)是通过调整适当的寄存器(例如 x86 中的 esp)来增加当前函数的堆栈帧。任何恰好在同一堆栈帧上但位于可变长度数组(或 alloca ed 内存)之后的变量将由 ebp + size_of_vla + constant 寻址。而不是简单的好旧ebp + constant .

由于堆栈指针在函数返回时(或通常在任何 {} block 退出时)恢复到前一个函数的帧,任何堆栈内存 alloca ted 将自动释放。

关于c - 堆栈上的运行时内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15639912/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com