c / c ++在堆栈上分配

我正在读[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)的空间。 (可能还有一些填充,阴影空间等等,不相关。)(技术上可以在运行时扩展堆栈帧的大小,但是你几乎不想这样做。)

链接地址: http://www.djcxy.com/p/84333.html

上一篇: c/c++ allocate on stack

下一篇: GCC with x64 sta