每次我们调用该函数时,激活记录的堆栈(通常只是称为堆栈)随着一条记录增长。相反,当函数返回时,它的记录不再被使用等等。栈(也叫调用栈)是一种按照先进先出的规则在一端增长和收缩的数据结构。
最后一行是否正确?我在 Bjarne Stroustrup 所著的《使用 C++ 的编程原理和实践》一书中读到了它。
让我向您展示调用堆栈的工作原理:假设您有一个程序,其中包含一些函数和子函数,例如f1()、f1.1()、f1.2()、f1.1.1()和,并且您有以下代码片段:f1.2.1()f1.2.2()
int f1(){
if (<condition>){ // B1
return f1.1();
} else {
return f1.2();
}
}
int f1.1(){
int temp = -1; // B2
return f1.1.1();
}
int f1.2(){
if <other_condition>{
return f1.2.1(); // B3
} else {
return f1.2.2();
}
}
int f1.1.1(){
int temp = 1001001;
return temp;
}
int f1.2.1(){
int temp = 1002001;
return temp;
}
int f1.2.2(){
int temp = 1002002; // B4
return temp;
}
Run Code Online (Sandbox Code Playgroud)
B1-B4 意味着您在该行上放置了一个断点,并且执行的方式是命中这些断点。让我们看看调用堆栈在这些时刻的样子:
B1:调用堆栈:
f1()
Run Code Online (Sandbox Code Playgroud)
B2:调用堆栈:
f1.1()
f1()
Run Code Online (Sandbox Code Playgroud)
B3:调用堆栈:
f1.2() // at the moment of the breakpoint, f1.2.1() not yet executed.
f1()
Run Code Online (Sandbox Code Playgroud)
B4:调用堆栈:
f1.2.2()
f1.2()
f1()
Run Code Online (Sandbox Code Playgroud)
调用堆栈从下到上填充:首先f1()被添加(该函数正在执行),当子函数(f1.1()或f1.2())被执行时,该子函数被添加到调用堆栈的顶部。一旦执行完成,它就会被删除。