出于某种原因,我想返回 my::Vector 的一个对象(它基本上是一个在内部使用 STL 向量进行实际存储的包装类,并且确实提供了一些额外的功能)。我按值返回向量,因为函数每次都在本地创建一个向量。
my::Vector<int> calcOnCPU()
{
my::Vector<int> v....
return v;
}
现在我可以有多个嵌套的函数调用(考虑到库设计),所以简而言之,如下所示:
my::Vector<int> calc()
{
if(...)
return calcOnCPU();
}
AFAIK,按值返回将调用 my::Vector 类的复制构造函数,它是:
Vector<int>::Vector(const Vector& c)
{
....
m_vec = c.m_vec; // where m_vec is std::vector<int>
}
几个问题: 1)在复制构造函数中,它是否调用 std::vector 的复制构造函数?或赋值运算符,只是为了确认,std::vector 创建深层副本(意味着复制考虑基本整数类型的所有元素)。2) 在 calc() 中嵌套 calcOnCPU() 每个返回的向量 int: 2 或 1 个 Vector 副本会被创建吗?在这种简单的方法嵌套的情况下,如何避免多个副本?内联函数还是存在另一种方式?
更新 1:对我来说很明显,我需要保留自己的复制构造函数,因为有一些自定义要求。但是,我在 main 函数中做了一个简单的测试:
int main() {
...
my::Vector v = calc();
std::cout<<v;
}
我在复制构造函数中使用“std::cerr”打印了一些内容,以查看它何时被调用。有趣的是,对于上述程序,它甚至没有被调用一次(至少没有打印任何内容)。是复制省略优化吗?我在 Linux 上使用 GNU C++ 编译器 (g++) v4.6.3。