浏览 2920 次
锁定老帖子 主题:局部对象生存期的疑问
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-07-10
比如下面的代码: #include<iostream> using namespace std; class T { public: T(){ cout<<"constructed"<<endl; } ~T(){ cout<<"destructed"<<endl; } }; T test(){ T t; return t; } int main(){ T t; t = test(); } 其输出是: 引用 constructed
constructed destructed destructed 但下面代码的输出结果我很不解 按我的理解,对于每次函数调用(m1,m2,m3),都会创建一个新的局部对象,然后在每次赋值运算后,这个局部对象会被析构。加上main方法中的对象t,一共应该会有4个对象被创建。但事实上只创建了一个对象。 就是说main方法中的对象t事实上指向方法m1中的那个局部对象。。。但m1方法调用结束后,其栈空间应该被释放,而m1中的对象t应该也随之被析构才对。 何解? #include<iostream> using namespace std; class T { public: T(){ id = ID++; cout<<"Object T::"<<id<<" constructed"<<endl; } T(const T& t){ this->id = t.id; cout<<"Clone constructed, id = "<<id<<endl; } T& operator=(const T& t){ this->id = t.id; cout<<"operator = called, id = "<<id<<endl; return *this; } ~T(){ cout<<"Object T::"<<id<<" destructed"<<endl; } private: int id; static int ID; }; int T::ID = 0; T m1(){ T t; return t; } T m2(){ T t(m1()); return t; } T m3(){ T t = m2(); return t; } int main(){ T t = m3(); } 输出结果: 引用 Object T::0 constructed
Object T::0 destructed 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-07-11
你的编译器是什么,在我这里(vc2008)输出结果确实为4个constructed
|
|
返回顶楼 | |
发表时间:2008-07-11
我用的是
引用 D:\Cpp\MinGW\bin>g++ --version g++ (GCC) 3.4.2 (mingw-special) Copyright (C) 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 那难道是GCC对代码做了优化? 问题是函数体内的对象使用的存储空间应该随着函数调用的完成会被释放才是,不得其解~~ |
|
返回顶楼 | |
发表时间:2008-07-12
想来想去只可能是这些函数的调用被inline处理了~
但没找到官方的说法,不知道C++标准里面有没有说明。 期待大牛的解释 |
|
返回顶楼 | |
发表时间:2008-07-12
Eastsun 写道 想来想去只可能是这些函数的调用被inline处理了~
但没找到官方的说法,不知道C++标准里面有没有说明。 期待大牛的解释 Return Value Optimization |
|
返回顶楼 | |