【发布时间】:2021-05-10 04:50:19
【问题描述】:
我想我可能问了一个非常错误的问题,但我真的试图通过谷歌搜索来理解它,但没有运气。
我们知道,我们有一个栈和堆。动态分配的堆,局部变量的堆栈等等
假设我有以下 c++ 代码。
void bla(int v1, int v2, int v3) {
int g = v1 + v2+ v3;
}
void nice(int g){
int z = 20;
int k = 30;
bla(g, z, k);
}
int main(){
cout<<"Hello World";
nice(40);
}
现在,让我们假设有一个堆栈。我知道例如值z,k,g 将存储在堆栈中。但是当我调用函数nice 调用bla 时,那些存储在哪里?我读过每个函数执行都会导致调用堆栈大小增加 1。我想说即使创建局部变量也会导致调用堆栈增加 1。
那么,这些(callstack, stack) 有什么关系?
这是我的假设:
当我们调用nice 时,会创建全新的stack。在那里,我们存储z and k。当nice 调用bla 时,现在为bla 创建另一个stack,第二个堆栈存储v1,v2,v3,g。等等。每个函数都需要自己的callstack,但我们也可以称它为stack。
【问题讨论】:
-
这将是实现的依赖。除了
std::stack和std::make_heap系列之外,C++ 本身没有堆和栈的概念。相反,它具有自动和动态的存储持续时间,并且描述了应该如何销毁这些对象。从理论上讲,创建一个不使用堆栈并在堆中分配所有内存的实现是完全有效的。 -
@PaulSanders 我看到了这个,但我希望能就我的假设是否正确以及堆栈和调用堆栈之间的实际区别进行更多讨论
-
一些架构将调用堆栈(返回地址堆栈)和用于寄存器(需要恢复)的单独数据堆栈和用于变量的自动存储分开。
-
回复:
I've read that each function execution causes call stack size to increase by 1- 这不是真的,或者说是过于简单化了。如果你想了解血淋淋的细节,你应该阅读calling conventions,但请注意,对于日常 C++ 开发,你根本不需要知道这一点。
标签: c++ memory stack heap-memory callstack