【发布时间】:2012-01-05 08:08:39
【问题描述】:
抱歉,如果之前有人问过这个问题,但据我了解,在 C++11 中,std::vector 有一个移动构造函数,因此在某些情况下,复制几乎没有任何成本,比如按值返回。但是,如果我有一个像这样的类,以 vector 作为成员变量:
class MyClass {
public:
MyClass() { }
MyClass(const MyClass& rhs) { }
// other interfaces
private:
std::vector<int> myvec;
// implementation
};
并且有一个按值返回其中之一的函数,例如
MyClass somefunc() {
MyClass mc;
// fill mc.myvec with thousands (maybe even millions) of ints
return mc;
}
mc.myvec 的移动构造函数是否会被调用,std::vector 的移动构造函数是否会被利用,即使 MyClass 本身对移动构造函数一无所知?还是会调用vector 的复制构造函数,然后将这数千(甚至数百万)的ints 一个一个复制?
【问题讨论】:
-
更好的是,任何实现 NRVO 的现代编译器都会忽略副本。
-
@K-ballo:取决于调用者写的内容。如果它是
MyClass mc; /* other code */ if (something) { mc = somefunc(); } else { mc = someotherfunc(); },或者以其他方式使用函数的返回值作为赋值的RHS,那么NRVO 不会阻止复制赋值。如果您要编写依赖 NRVO 来实现基本效率的函数,则需要确保类可以有效地移动或可以有效地交换,以捕捉 NRVO 不适用的情况。
标签: c++ vector c++11 move-constructor