【发布时间】:2021-11-23 03:58:54
【问题描述】:
我试图弄清楚alloca() 在内存级别上的实际工作方式。来自linux man page:
alloca() 函数在栈中分配 size 个字节的空间 调用者的框架。这个临时空间会自动释放 当调用 alloca() 的函数返回给它的调用者时。
这是否意味着alloca() 将堆栈指针转发n 字节?或者新创建的内存具体分配在哪里?
这不是和variable length arrays一模一样吗?
我知道实现细节可能留给操作系统和其他东西。但我想知道一般这是如何实现的。
【问题讨论】:
-
你的理解很准确。
-
大多数情况下,它完全按照 linux 手册页的描述完成,是的,在这种情况下,堆栈指针减少了 n 个字节(或者由于各种原因可能比 n 多一点像内存对齐等)。是的,当你使用 VLA 时,或多或少会发生同样的事情
-
@Jabberwocky 请使用“自动 VLA” 术语
-
如果有人愿意,可能值得展开更详细的解释来说明它是如何实现的(我不确定我是否会解释得很好)。在快速测试中,看起来 gcc 内联了
alloca()的效果,这是有道理的——编译器必须知道堆栈帧已经改变——但它似乎使用了一些与线程本地存储相同的机制,例如使用%fs寄存器。 -
@sj95126:您看到的
%fs很可能是stack canary;金丝雀值保存在线程本地存储中。它与 alloca 本身并没有真正的关系,所以-fno-stack-protector可能会清理一下。
标签: c variable-length-array stack-frame alloca