C++:如何在循环内的堆栈上创建对象?

Man*_*ena 5 c++ loops object

假设我有这样的代码:-

struct myStruct{

    int a;
    int b;
};

int main(){

    for(int i=0; i<5; i++){

        myStruct obj; 
        cout<<"Address of object in memory : "<<&obj<<endl;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这实际上会在堆栈上创建 5 个不同的对象吗?如果是这样,为什么考虑到 obj 是实际对象而不是对该对象的引用,它每次都会打印完全相同的内存地址?我已经在网站上阅读了一些答案,但我仍然无法完全理解它。

Pet*_*ter 1

该对象obj在每次迭代开始时创建,并在结束时销毁。

如果将输出语句放置在其构造函数和析构函数中,您将能够看到这种情况的发生。(尽管从技术上讲,如果检测对象存在的唯一方法是跟踪构造函数和析构函数调用,则编译器可以自由地删除对象,但大多数编译器在这种情况下可能不会这样做,因为替代方案是在开始时重新初始化对象。每次迭代)。

您还可以通过添加额外的范围来看到这一点。

int main()
{

   for(int i=0; i<5; i++)
   {
      {   // extra scope here
          myStruct obj; 
          cout<<"Address of object in memory : "<<&obj<<endl;
      }
      obj = something();   //   will not compile since obj does not exist here
   }

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

对于使用堆栈(标准不要求的实现细节)的编译器,很可能在一次迭代结束和下一次迭代开始之间不会将其他变量放置在堆栈上。这可以解释你看到所有对象都具有相同的地址。