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

実際には、標準では、コピー コンストラクターを最適化して取り除き (これはcopy elisionと呼ばれます)、値をその場で構築することを明示的に許可しています。それ次のようになります。

void fillStack(stack&);

int main() {
  stack s;
  fillStack(s); // with reference
}

ただし、コンパイラがこの変換を適用したとしても、コピー構築は整形式でなければなりません。copy-construction に副作用がある場合、この最適化はやや奇妙な動作につながる可能性があります (copy-constructor から何かを出力してみて、さまざまな最適化レベルでの動作を観察してください)。

この最適化は、移動セマンティクスにより、C++11 ではほとんど不要になります。

于 2012-12-15T17:17:09.747 に答える
0

コンパイラの最適化がないと仮定すると、それは 2 つのコピー コンストラクター呼び出しになるはずです。s

于 2012-12-15T17:17:46.960 に答える