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下一篇: GCC with x64 sta