0

簡単に言えば、次のような状況があります。

class K {
  K clone() const{K cl; /* clone this to cl then */ return cl; }
};
K* call_clone()
{
  K k;
  return new K(k.clone());
}

コンパイラの最適化後、これは二重にコピーされますか?

あるいは、より効率的な
実装になりますか?C*clone()

このような:

class K {
  K* clone() const { K*p=new K(); /* clone this to *p then */ return p; }
};
K* call_clone()
{
  K k;
  return k.clone();
}

(Kの浅いコピーでもコストがかかる可能性があるため、これを尋ねます。実際にはクラスデータ構造体になります。)

4

2 に答える 2

0

トラディショナルclone()は、ヒープ上にコピーを作成します。例:

T* clone() { return new T(*this); }

それ以外の場合は、単純にコピー コンストラクターを呼び出すことができます。

したがって、call_clone()次のようになります。

K* call_clone() {
    K k;
    return k.clone();
}

コンパイラの最適化後、これは二重にコピーされますか?

定義が利用可能な場合clone()(関数がインラインであるか、テンプレートから生成されている場合)、コンパイラはローカル変数の作成とコピーを最適化することがあります。

于 2012-11-14T13:57:59.823 に答える
0

コンパイラの最適化後、これは二重にコピーされますか?

コンパイラに依存します。最新のコンパイラは二重コピーを実行しません。これはReturn Value Optimizationと呼ばれます。の定義が利用可能かどうかには依存しませclone()ん。

C*clone() を使用した実装はより効率的でしょうか?

いいえ、そうはなりません。動的メモリ管理 (演算子 new/delete など) は非常にコストがかかります。コピーコンストラクターが実際に何をするかによっては、二重コピーを実行するよりもさらにコストがかかる場合があります。

于 2012-11-14T14:03:06.690 に答える