论坛首页 编程语言技术论坛

局部对象生存期的疑问

浏览 2920 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-07-10  
C++
按我的理解,对于在函数体中创建的对象(不是用new创建的),其存储空间是程序的运行栈中,当函数返回的时候,该对象将会被析构(如果这个对象被返回赋值,那么析构发生在赋值运算之后)。
比如下面的代码:
#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
   发表时间:2008-07-11  
你的编译器是什么,在我这里(vc2008)输出结果确实为4个constructed
0 请登录后投票
   发表时间: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对代码做了优化?
问题是函数体内的对象使用的存储空间应该随着函数调用的完成会被释放才是,不得其解~~
0 请登录后投票
   发表时间:2008-07-12  
想来想去只可能是这些函数的调用被inline处理了~
但没找到官方的说法,不知道C++标准里面有没有说明。
期待大牛的解释
0 请登录后投票
   发表时间:2008-07-12  
Eastsun 写道
想来想去只可能是这些函数的调用被inline处理了~
但没找到官方的说法,不知道C++标准里面有没有说明。
期待大牛的解释


Return Value Optimization
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics