【问题标题】:Does a call stack grow first in / first out in C++?调用堆栈是否在 C++ 中先入先出?
【发布时间】:2021-03-19 10:56:05
【问题描述】:

每次我们调用函数时,激活记录的堆栈(通常只称为堆栈)会随着一条记录增长。反之,当函数返回时,它的记录不再被使用,以此类推。堆栈(也称为调用堆栈)是一种根据先进先出规则在一端增长和收缩的数据结构。

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

【问题讨论】:

  • 你能解释一下你所说的“陈述就像”是什么意思吗?这不是一个格式正确的句子。
  • 你为什么要质疑最后一行?我并不是说你应该简单地接受你读到的东西,但是随机挑选一些相信和不相信的台词似乎很奇怪。是什么让你特别选择了这条线?有没有什么具体的不合理的地方?
  • 我在网上找到了该文本的副本:您确实正确引用了第 8.5 节倒数第二段。 errata, here 中没有任何相关内容。击败我,但绝对是(先进后出)和(后进先出)的堆栈。绝对不是(先进先出)。 Stroustrup 本人在他的词汇表中说 here "stack - (1) 用于保存函数局部变量的内存。(2) 标准库 *先进后出* 序列。TC++ PL 10.4.3、17.3.1、D&E 2.3、3.9。"
  • 先进先出意味着您调用的第一个函数(通常是 c++ 中的 main)首先被清理。这在逻辑上是错误的。 main 函数是在所有其他函数返回后被清理的最后一个函数。我认为这本书有错字。
  • Ataxias 添加的重点有所帮助,但我仍然认为关于您为何质疑最后一行的陈述会改善您的问题的表述。

标签: c++ callstack


【解决方案1】:

这是一个错误。 根据定义,堆栈是后进先出 (LIFO)。先进先出 (FIFO) 数据结构是队列,而不是堆栈。

【讨论】:

    【解决方案2】:

    让我向您展示调用堆栈的工作原理:假设您有一个程序,其中包含一些函数和子函数,例如 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;
    }
    

    B1-B4 意味着您在该行上放置了一个断点,并且执行是以这样一种方式完成的,即这些断点会被命中。让我们看看调用堆栈如何看待这些时刻:

    B1:调用栈:

    f1()
    

    B2:调用栈:

    f1.1()
    f1()
    

    B3:调用堆栈:

    f1.2() // at the moment of the breakpoint, f1.2.1() not yet executed.
    f1()
    

    B4:调用堆栈:

    f1.2.2()
    f1.2()
    f1()
    

    调用堆栈从下到上填充:首先添加f1()(正在执行此函数),当执行子函数(f1.1()f1.2())时,将添加到调用堆栈顶部.一旦执行完成,它就会被移除。

    【讨论】:

      猜你喜欢
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 2018-12-24
      • 2021-06-28
      • 2021-08-06
      • 2013-10-12
      相关资源
      最近更新 更多