【发布时间】:2016-11-12 20:01:17
【问题描述】:
我尝试了解 C++ 程序执行期间的内存管理。我知道当一个函数被调用时,一个函数框架被放置在堆栈上。它由该函数的所有局部变量组成。我也知道堆栈是一种数据结构,其组织方式只有顶部的数据可以访问。那么为什么在该函数内的所有行中都可以访问任何局部变量呢?让我们考虑这个例子:
void function(int a, int b){ //Stack frame of function is placed on stack
a++; //variable a can be incremented
b++; //variable b can be incremented
a++; //variable a can be incremented again
}
假设堆栈在第一行代码之后以这种方式组织:
Variable a
----------
Variable b
----------
(...)
所以我假设我可以在函数的第二行访问变量,因为它位于堆栈的顶部,但是接下来如何访问变量 b? 我认为它就像变量 a 被拉出堆栈,因此可以访问变量 b。但是为什么我可以在代码的下一行中到达变量 a 呢?它在上一步中被拉出堆栈。
【问题讨论】:
-
“我也知道堆栈是一种数据结构,其组织方式只能访问顶部的数据”这是错误的,堆栈是一种仅允许您添加或删除元素的数据结构在顶部。
-
@tobi303:这取决于我们讨论的堆栈类型。真正的堆栈机器只能访问堆栈顶部的值。只是现代处理器架构不是堆栈机器。
-
呃,那是……是什么让你这么想?堆栈(通常)仅用于将参数传递给函数。如果您查看生成的汇编代码,首先发生的事情之一是将值从堆栈移动到 CPU 寄存器中。您也可以随时访问堆栈上的任何值。
-
@UnholySheep:堆栈肯定也是用来保存局部变量的,除非你只有几个(而且你不知道它们的地址):声明一个本地的
int x[1000],这将在堆栈上。 -
最重要的是要理解“堆栈”是一个实现细节。 C++ 根本不需要函数调用帧的堆栈,只是碰巧流行的实现会发出以这种方式工作的代码。因此,试图从有关堆栈的事实中推导出 C++ 语义是没有意义的,因为它是倒退的:nothing 关于堆栈对代码的工作方式强制或强加任何要求。
标签: c++ c memory memory-management