在上一个问题中,一个普通的按值返回函数似乎总是将其return
参数复制到从它分配的变量中。
这是标准要求的,还是可以通过在函数体内构造“分配给”变量来优化函数?
struct C { int i; double d; };
C f( int i, int d ) {
return C(i,d); // construct _and_ copy-construct?
}
int main() {
C c = f( 1, 2 );
}
在上一个问题中,一个普通的按值返回函数似乎总是将其return
参数复制到从它分配的变量中。
这是标准要求的,还是可以通过在函数体内构造“分配给”变量来优化函数?
struct C { int i; double d; };
C f( int i, int d ) {
return C(i,d); // construct _and_ copy-construct?
}
int main() {
C c = f( 1, 2 );
}
该标准允许在此处进行任何级别的复制遗漏:
该标准说不需要使用复制构造函数 - 请参阅第 12.8/15 节:
15 每当使用复制构造函数复制临时类对象,并且该对象和副本具有相同的 cv 非限定类型时,允许实现将原始类对象和副本视为引用同一对象的两种不同方式,而不是完全执行复制,即使类复制构造函数或析构函数有副作用。
还有更多类似的情况。
方式不通过引用传递参数并将结果分配给它?
有一种非常简单且很好的方法可以完全避免此类考虑 - 您可以考虑将 boost::shared_ptr 返回到创建的对象 - 在可用性方面它实际上是相同的,但您的对象肯定不会被不必要地复制 - 而且它如果您通过几层函数调用返回它,这也是正确的。