如果我有如下功能:
stack fillStack(){
stack a;
return a;
}
void main(){
stack s=fillStack();
}
考虑我们有一个名为stack
. 将调用多少个构造函数和析构函数?
如果我有如下功能:
stack fillStack(){
stack a;
return a;
}
void main(){
stack s=fillStack();
}
考虑我们有一个名为stack
. 将调用多少个构造函数和析构函数?
这是应该发生的事情:
stack fillStack() {
stack a; // constructor
return a; // copy constructor and destructor a
}
int main(){
stack s=fillStack(); // copy constructor and destructor of the temporary
} // destructor s
在实践中,该标准明确允许优化复制构造函数(这称为复制省略)并在适当位置构造值。最终可能看起来像这样:
void fillStack(stack&);
int main() {
stack s;
fillStack(s); // with reference
}
尽管如此,即使编译器应用了这种转换,复制构造仍然必须是格式良好的。如果复制构造会产生副作用,那么这种优化可能会导致一些奇怪的行为(尝试从复制构造函数打印一些东西并观察不同优化级别的行为)。
由于移动语义,C++11 基本上不需要这种优化。
假设没有编译器优化,它应该是 2 次复制构造函数调用 - 一次从函数本地到临时返回值,一次从临时返回值到s