调用堆栈是否在 C++ 中先入/先出?

Rav*_*mar 5 c++ callstack

每次我们调用该函数时,激活记录的堆栈(通常只是称为堆栈)随着一条记录增长。相反,当函数返回时,它的记录不再被使用等等。栈(也叫调用栈)是一种按照先进先出的规则一端增长和收缩的数据结构。

最后一行是否正确?我在 Bjarne Stroustrup 所著的《使用 C++ 的编程原理和实践》一书中读到了它。

Dom*_*que 1

让我向您展示调用堆栈的工作原理:假设您有一个程序,其中包含一些函数和子函数,例如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())被执行时,该子函数被添加到调用堆栈的顶部。一旦执行完成,它就会被删除。