1

如果我有如下功能:

stack fillStack(){
  stack a;
  return a;
}

void main(){
  stack s=fillStack();
}

考虑我们有一个名为stack. 将调用多少个构造函数和析构函数?

4

2 回答 2

3

这是应该发生的事情:

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 基本上不需要这种优化。

于 2012-12-15T17:17:09.747 回答
0

假设没有编译器优化,它应该是 2 次复制构造函数调用 - 一次从函数本地到临时返回值,一次从临时返回值到s

于 2012-12-15T17:17:46.960 回答