首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于函数返回vector的有关问题

2013-04-20 
关于函数返回vector的问题代码:#include iostream#include vectorusing namespace stdclass T{public

关于函数返回vector的问题
代码:


#include <iostream>
#include <vector>

using namespace std;

class T
{
public:
    T()
    {
        cout<<"T , "<<endl;
    }
    T(const T &t)
    {
        cout<<"copy T, "<<endl;
    }
    ~T()
    {
        cout<<"~ T, "<<endl;
    }
};

vector<T>  f1()
{
    vector<T>  v(3);
    cout<<"return "<<endl;
    return v;
}

void test1()
{
    cout<<" ----" <<endl;
    vector<T> t1=f1();
    cout<<" ===" <<endl;
    cout<<t1.size()<<endl;
}

int main()
{
    test1();
    return 0;
}


结果:
 ----
T , 
copy T, 
copy T, 
copy T, 
~ T, 
return 
 ===
3
~ T, 
~ T, 
~ T, 

疑问:
函数f1()返回时,应该重新构造一个vector才对,但是显示的结果是没有构造。没有构造的话,函数返回后函数中的v应该不存在了,为什么还存在,size为3?


后来我又修改了函数,让f1返回vector<T> 引用,其他不变。编译时会警告:返回局部变量的引用,但是运行结果:
 ----
T , 
copy T, 
copy T, 
copy T, 
~ T, 
return 
~ T, 
~ T, 
~ T, 
copy T, 
copy T, 
copy T, 
 ===
3
~ T, 
~ T, 
~ T, 

居然:局部对象先析构,然后拷贝。。
1、析构了从那里拷贝??
2、返回引用不是不用拷贝对象的吗?
这和上面的直接返回不是刚好反了吗?


后面继续测试,把类T换成int型的,结果。。。
返回非引用时没问题(但是看不到有没有拷贝),返回引用时里面的数据错了,但是vector的容量是对的。

实在搞不明白是怎么回事。。。?
请大神解释下。
编译环境:
Ubuntu 12.04,
g++ 4.6.6
vector g++
[解决办法]
引用:
理论上是这样,但是为什么还能size=3?
而且,返回不是引用:最开始是 "返回值优化"

返回局部变量的引用是错误的。
是拷贝一个无效的vector

搜索下 返回值优化 不就明白了嘛
[解决办法]
vector<T> t1=f1();调用拷贝构造函数 直接用返回的vector构造t1,所以返回值和t1是同一对象!
所以返回的Vector对象就是t1本身,这是初始化和赋值的区别。应该是初始化优化才对!


[解决办法]
vector<T> t1=f1();和 vector<T> t1(f1());效果相同;vector<T>对象,只会构造一次。这是针对初始化的优化。
[解决办法]
编译器优化的缘故。
像这种vector<T> f1();
vector<T> ret = f1();

//主流编译器会优化成

vector<T> ret;
f1(ret);//f1会被优化成void f1(vector<T> &);

热点排行