出于某种原因,我想返回my :: Vector的对象(这基本上是一个包装类,内部使用STL向量用于实际存储,并提供一些额外的功能) 。随着函数每次在本地创建一个向量,我会按值返回向量。通过C++中的多重函数嵌套值返回向量
my::Vector<int> calcOnCPU()
{
my::Vector<int> v....
return v;
}
现在我可以有函数调用(考虑库设计)多重嵌套,因此,在短期类似如下:
my::Vector<int> calc()
{
if(...)
return calcOnCPU();
}
据我所知,通过价值回归将调用我的::拷贝构造函数Vector类这是一件好事:
Vector<int>::Vector(const Vector& c)
{
....
m_vec = c.m_vec; // where m_vec is std::vector<int>
}
几个问题: 1)在拷贝构造函数,它被调用的std ::载体的拷贝构造函数?或赋值运算符,只需确认,std :: vector创建深度复制(意味着复制考虑基本整数类型的所有元素)。 2)在Calc()中嵌套calcOnCPU(),每个都返回int的Vector:2或1个Vector的拷贝将被创建?如果这种简单的方法嵌套,我怎么能避免多个副本?内联函数还是存在另一种方式?
UPDATE 1:对我来说很明显我需要保留我自己的拷贝构造函数,因为有一些自定义需求。但是,我做了一个简单的测试,主要功能:
int main() {
...
my::Vector v = calc();
std::cout<<v;
}
我把一些印刷用我的拷贝构造函数“的std :: CERR”时看到它被调用。有趣的是,上面的程序甚至不会调用它(至少不会打印)。是否复制椭圆优化?我在Linux上使用GNU C++编译器(g ++)v4.6.3。
即将推出的(当前?)C++标准中有“移动语义”。是的,STL向量执行深层复制,这就是你的代码 – fork0 2012-07-06 12:47:37
[Rvalue引用和移动构造函数](http://en.wikipedia.org/wiki/C%2B%2B11#Rvalue_references_and_move_constructors) – fork0 2012-07-06 12:49:07
如果你试图摆脱临时副本,也许你可以让每个嵌套函数为你的向量引用一个引用参数,你修改... – 2012-07-06 12:51:04