コピーの省略 コピーの省略の概要

コピーの省略

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/11/28 09:04 UTC 版)

しかし、プログラムの動作が変更され得るにもかかわらず、それでもコピーが省略されうる状況を言語標準は幾つか挙げている。その中で最も有名なのが戻り値最適化であり、もう一つは、クラス型の一時オブジェクトが、同じ型のオブジェクトへとコピーされるときの最適化である。これも広く実装されており、C++言語標準で挙げられている。[1] 結果的に、コピー初期化直接初期化の間にパフォーマンス上の違いはないが、セマンティクス上ではそうではなく、コピー初期化にはアクセス可能なコピーコンストラクタが未だに必要である。[2] なお、参照に束縛されている一時オブジェクトは最適化されない。例:

#include <iostream>
int n = 0;
struct C {
  explicit C(int) {}
  C(const C&) { ++n; } // 目に見える副作用を持つコピーコンストラクタ
};                     // 静的な記憶時間を持つオブジェクトを書き換える

int main() {
  C c1(42); // 直接初期化。 C::C(42) を呼ぶ
  C c2 = C(42); // コピー初期化。 C::C( C(42) ) を呼ぶ
  
  std::cout << n << std::endl; // コピーが省略されたなら 0 、そうでなければ 1 を出力する
  return 0;
}

言語標準によると、例外として投げられるオブジェクトにも、同じような最適化が適用される。[3][4] しかし、投げられたオブジェクトから例外オブジェクトへのコピー、そして例外オブジェクトから例外宣言catch節へのコピーのどちらも、最適化されるかもしれないし、されないかもしれない。これは、一時オブジェクトでも、名前付きオブジェクトでも同様である。[5] 例:

#include <iostream>

struct C {
  C() {}
  C(const C&) { std::cout << "Hello World!\n"; }
};

void f() {
  C c;
  throw c; // 名前付きオブジェクト c を例外オブジェクトにコピー。
}          // このコピーが省略されるかどうかは不確かである。

int main() {
  try {
    f();
  }
  catch(C c) {  // 例外オブジェクトを例外宣言内の一時領域にコピー。
  }             // このコピーも省略されるかどうかは不確かである。
}

言語標準に準拠したコンパイラは、上記のコードから"Hello World!"と二度出力するプログラムを生成しなければならなかった。C++11では、名前付きオブジェクトの例外オブジェクトへのコピーと、例外ハンドラで宣言されたオブジェクトへのコピーを省略することを本質的に許した[5]ことで、その問題は対処された。

GCC-fno-elide-constructorsオプションを提供して、コピーの省略を無効化できるようにしている。このオプションは戻り値最適化の効果を発見(あるいは見逃し!)するのに有用である。平時にこの重要な最適化を無効化することは推奨しない。


  1. ^ ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ ツァ12.8 Copying class objects [class.copy] para. 15
  2. ^ Sutter, Herb (2001). More Exceptional C++. Addison-Wesley 
  3. ^ ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ ツァ15.1 Throwing an exception [except.throw] para. 5
  4. ^ ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ ツァ15.3 Handling an exception [except.handle] para. 17
  5. ^ a b C++ Standard Core Language Defect Reports”. WG21. 2009年3月27日閲覧。


「コピーの省略」の続きの解説一覧



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「コピーの省略」の関連用語

1
6% |||||

コピーの省略のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



コピーの省略のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのコピーの省略 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。

©2024 GRAS Group, Inc.RSS