【发布时间】:2013-11-01 11:06:45
【问题描述】:
我正在阅读有关堆栈指针的 [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
【问题讨论】:
-
C 和 C++ 中的所有变量都存在于 作用域 上下文中。例如,函数中的局部非静态变量仅对该函数是自动的。也就是说,您认为代码中
b的存在范围是什么? -
从编译器的角度来看,您的示例中没有任何“不受控制”的地方。
-
文章在哪里说“你需要知道这两个,因为堆栈可以增长”?它只讨论在堆栈上传递的参数。
-
通常给定帧的堆栈大小是固定的,但是我见过(在古代)一个我不记得名字的函数,它可以通过简单地扩展堆栈来分配内存堆栈帧的大小。这比 malloc 调用快得多,而且它不必被释放(事实上,这是不可能的)——而是在当前堆栈帧终止时自动释放。
-
@mah 你想到的是
alloca(有时带有一些下划线前缀),它至今仍然存在。
标签: c++ c cpu-registers