循环和调用堆栈

Loops and the call stack

本文关键字:堆栈 调用 循环      更新时间:2023-10-16

如果我在循环中使用以下:

    ostringstream glob;
    glob << "some words";
    cout<< "this is bob"<<glob.str()<<endl;

glob 在每次迭代时都会重置。 但是,如果我在循环外声明 glob,那么每次迭代都会不断添加"一些单词",从而导致字符串越来越长。

我试图理解为什么。 这是因为每次循环运行时,此变量都会从堆栈中弹出吗?

以为如果我在每个循环中"红声明"glob,那么我会收到一个错误,但我没有......

如果你在作用域内声明变量,那么每次你进入循环(它在堆栈上)时都会创建(构造)它。如果你在循环之外声明它,而不是你继续重用的单个实例。

另请参阅:

  • C++范围
  • 构造函数和析构函数概述

澄清一下,您正在询问这两者之间的区别:

ostringstream glob;
for ( int i = 0; i < 100; ++i )
{
    glob << "some words";
    cout<< "this is bob"<<glob.str()<<endl;
}

而这个:

for ( int i = 0; i < 100; ++i )
{
    ostringstream glob;
    glob << "some words";
    cout<< "this is bob"<<glob.str()<<endl;
}

首先,"glob"在循环之前初始化一次,因为它的作用域在循环体之外。在第二个"glob"中,它位于循环体中(在定义循环范围的大括号内),因此被新放置在堆栈上并在每次迭代时初始化(并在每次迭代结束时销毁)。

当 glob 在循环内时,它的作用域是循环的每次迭代。因此,当它超出范围时,它将被删除(从堆栈中弹出),并在下一次迭代中重新创建(推送到堆栈上)。

当 glob 在循环之外时,它的作用域是方法,在方法完成之前不会删除它。