关于函数返回vector的有关问题
关于函数返回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++
[解决办法]搜索下 返回值优化 不就明白了嘛
[解决办法]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> &);