gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 02:02:02 26 4
gpt4 key购买 nike

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

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

假设我有以下 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com