C/C++ 在堆栈上分配
c/c++ allocate on stack
我正在阅读[1]关于堆栈指针以及了解ebp(函数堆栈的开始)和esp(结束)的需求。文章说你需要知道两者,因为堆栈可以增长,但我看不出这在 c/c++ 中是如何实现的。(我不是在谈论另一个函数调用,因为在我看来,这将使堆栈增长,做一些事情,然后递归地弹出并在调用前返回状态)
我做了一些研究,只看到人们说new
在堆上分配。但是指针将是一个局部变量,对吧?这在编译时是已知的,并在调用函数时保留在堆栈中。
我开始认为,也许通过循环,您有数量不受控制的局部变量
int a;
for (int i = 0; i < n; ++i)
int b = i + 3;
但是不,这不会分配 n 次b
,并且只保留 1 个 int,就像它为 a
一样。
所以......任何例子?
[1):http://en.wikibooks.org/wiki/X86_Disassembly/Functions_and_Stack_Frames
stdlib 中的alloca
函数在堆栈上分配内存。我不建议在生产代码中使用此功能。很容易损坏堆栈或堆栈溢出。
使用 EBP 更多是为了方便。可以只使用 ESP。问题是,当函数的参数被推送到堆栈上时,所有变量和参数相对于 ESP 的地址都会发生变化。
通过将 EBP 设置为堆栈上的固定已知位置(通常在函数参数和局部变量之间),所有这些元素的地址在函数的整个生命周期内相对于 EBP 保持不变。它还可以帮助调试,因为函数末尾的 ESP 值应等于 EBP 的值。
据我所知,在编译时以不确定的方式增长堆栈的唯一方法是反复使用 alloca。
指针确实在堆栈上分配。在 32 位和 64 位架构上,大小通常分别为 4 或 8 字节。因此,您在编译时静态地知道指针的大小,并且如果您选择这样做,您可以将它们保留在堆栈上。
此指针可以指向空闲存储,您可以动态为其分配内存 - 而无需事先知道大小。此外,保持堆栈帧为空通常是一个好主意,编译器甚至会通过(可调)限制来"强制执行"这一点。如果我没记错的话,MSVC 有 1MB。
所以不,你不可能创建一个在编译时未知大小的堆栈帧。您发布的代码的堆栈帧将有 3 个整数(a、b、i)的空间。(可能还有一些填充、阴影空间等,不相关。(从技术上讲,在运行时扩展堆栈帧的大小是可能的,但您只是不想几乎永远这样做。
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 从堆栈分配的原始指针构造智能指针
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 巨大的内存分配:堆栈与堆
- 有效地分配堆栈对象(由函数的值返回)到堆?
- 为什么不能在 Visual C++ 中动态分配堆栈内存?但海湾合作委员会可以做到
- 为什么分配堆内存比分配堆栈记忆更快
- 安全分配堆栈分配的阵列
- 附加到具有非动态分配堆栈的向量
- 是否随作用域分配和解除分配堆栈帧
- 在执行中脱离堆栈对象的范围之前,请分配堆栈对象
- 全局阵列分配 -- 堆栈或堆
- 如何使新操作员超载以分配堆栈
- 具有类作用域的动态分配堆栈内存
- 如何在 Linux 下为可执行文件分配堆栈
- 内存分配堆栈
- 成员函数内存分配堆栈或堆
- 在 c++ 中重新分配堆栈上的对象
- 防止为类和派生类分配堆栈
- 如何防止msvc++为switch语句过度分配堆栈空间?