c++ - 调用堆栈和堆栈有什么区别?

标签 c++ memory stack heap-memory callstack

我想我可能问了一个非常错误的问题,但我真的试图通过谷歌搜索来理解它,但没有运气。

众所周知,我们有栈和堆。堆用于动态分配的,栈用于局部变量等。

假设我有以下 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 将存储在堆栈中。但是当我调用调用 bla 的函数 nice 时,它们存储在哪里?我读到每个函数执行都会导致调用堆栈大小增加 1。我会说即使创建局部变量也会导致调用堆栈增加 1。

那么,那些(callstackstack)究竟是如何相关的?

这是我的假设:

当我们调用nice 时,会创建全新的堆栈。在那里,我们存储了 z 和 k。当 nice 调用 bla 时,现在会为 bla 创建另一个 stack 并且第二个堆栈存储 v1, v2,v3,g。等等。每个函数都需要自己的callstack,但我们也可以调用这个stack

最佳答案

每个正在运行的进程都被分配了一 block 内存,它称之为“堆栈”。而且,这个内存区域同时用于表示“调用/返回序列”(通过所谓的“堆栈帧”),所谓的“每个被调用的例程使用的局部变量”。它们是一回事。

通常,不同的 CPU 寄存器用于同时指向每个事物。一个寄存器指向“局部变量”值,而另一个完全不同的寄存器指向“堆栈帧”。 (在解释器中,使用了类似的机制。)还有第三个寄存器指示当前的“栈顶”。

在开始执行每个新函数时,在“局部变量指针”记住它曾经是什么之后,“堆栈顶部”简单地向前移动以说明局部变量。

当发生“从子程序返回”时,“栈顶指针”恢复到某个先前的值,并且所有曾经存在于“它之上”的东西现在,从字面上看,都被遗忘了。 因为它不再重要。

关于c++ - 调用堆栈和堆栈有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66070159/

相关文章:

c++ - 隐藏的移动构造

c++ - 在条件中评估字符串

c++ - memset函数各种使用方式的区别

memory - CUDA 表面与纹理

ios - 如何使用 'PFImageView' 优化内存?

c++ - 如何在 C++ 中增加堆栈大小?

c - 无法使用正确的节点创建堆栈

c++ - iMX6 上的 Qt5 : how to make sure the hardware acceleration is in use?

Mac 上 hdiutil 的 C++ 接口(interface)

c# - 什么时候函数内的局部变量*实际上*被分配