C++対象モデルを深く探求する本の中でコピー構造関数とNRV関係の検討
3575 ワード
回転:http://blog.guorongfei.com/2016/01/11/cpp-copy-constructor-nrv/
最近深くC++の対象の模型の1冊を探求して、P 67の中で最後の1段の話の第1文に対してとても理解していません
このプログラムの最初のバージョンはNRV最適化を実施できない. test classに1つ欠けています
この問題に対して、私は
著者の観点
この解釈は著者
初期のcfrontでは、コードをNRV最適化するかどうかを決定するスイッチが必要でした.これは、お客様(プログラマ)が明示的に提供するコピー構造関数があるかどうかです.お客様がコピー構造関数を提供することを表示していない場合、cfrontは、お客様がデフォルトのビット単位コピーの意味に満足していると考えています.ビット単位コピー自体が効率的であるため、NRVの最適化を実施する必要はありません.しかし、お客様が明示的にコピーコンストラクション関数を提供している場合、これは、お客様が特定の理由(例えば、深いコピーが必要であるなど)で効率的なビット単位コピーの意味から抜け出すため、コピー動作のオーバーヘッドが増大するため、NRV最適化が適用され、その結果、不要なコピー関数呼び出しが削除されることを示しています.
これは著者がそう言ったのは
翻訳者の観点
著者が説明した以上、他の解釈はもともとあまり必要ではなかったが、これらの観点は本の理解に一定の助けになったので、ここにも記録されている.
この本の翻訳者の侯捷さんは彼のFAQの中でこの問題について読者との討論がある.プロセスは次のとおりです.
leetronは侯捷に手紙を書いた.
質問:67ページで、一番下の2行:このプログラムの最初のバージョンは、test classにcopy constructorが欠けているため、NRV最適化を実施できません.しかし、66ページの「コンパイラレベルで最適化」に列挙されたコードは、コンパイラがxxを_result置換、_result.X::X(); すなわちdefault constructorが呼び出される.default constructorを呼び起こすのは理解できますが、コンパイラ変換後のコードはcopy constructorには使用されていません.なぜ67ページの最後の2行にcopy constructorが1つ欠けていると、この最適化は実施できませんか?
私は上の問題について少し説明したが、私の推測が正しいかどうか分からない.
私の解釈は、63ページと64ページの「戻り値の初期化」の段落のように、コンパイラは63ページの下のX bar()関数定義を64ページの仮想コードに変換することができ、そのうちの1行は_result.X::X(xx); これはcopy constructorに使用されます.
64ページのコードに変換すると、65ページと66ページには、66ページのコンパイラレベルで最適化される2つの後続の可能性のある最適化動作が記述されている.このように、66ページ最適化されたコードはcopy constructorを使用していないように見えますが、これらのコードは64ページのようなコード(注一)に基づいて最適化されていますが、copy constructorがなければ、copy constructorを呼ぶ動作があるため、64ページのような仮想コードに変換することはできません.だから、66ページはコンパイラの最適化の結果が省けましたがresult.X::X(xx); このcopy constructorの呼び出し動作(xxがまったくないため)は、copy constructorを提供することが理解されていなければ、コンパイラにこのような最適化を行うことはできません.
一方、私は第5章205ページの一番下の段落を受験しました.「一般的にあなたの設計の中には、多くの手紙が価値を伝える必要があります(by value)local class object....では、copy constructorを提供するのは合理的です.default memberwiseの意味が十分であっても、その出現はNRVの最適化をトリガーします.しかし、私が前の例で示したように、NRVの最適化後、copy constructorを喚起する必要はありません.演算結果は直接計算されているので、「転送されるobject」が体内に入っているので、上記のようにその解釈を提案しますが、正しいかどうかは不明ですので、e-mailでご確認いたします.
注一:もちろん、コンパイラがどのようにこれらの変換動作を実際に行うのかは、理論的には未知であり、一概には言えないので、私は「64ページのようなコード」を書きます.
侯捷の答えは:
まず、leetronは彼の意味をよく説明しています.私が受け取った読者からの手紙の中で、上品です.特にこのような複雑な考えを説明しています.
次にleetronが言ったことに同意します.
64ページのコードに変換すると、65ページと66ページには、66ページのコンパイラレベルで最適化される2つの後続の可能性のある最適化動作が記述されている.
しかし、私はleetronのこのような見方に同意しません.
このように、66ページ最適化されたコードはcopy constructorには使用されていないように見えるが、これらのコードは64ページのようなコード(注一)最適化によって得られるものであり、
NRV最適化は、p 63の元のコードからp 64の仮想コード、さらにp 66の最適化ではないと思います.p 63の元のコードから直接p 66の最適化に至ると思います.したがって、copy ctorを必要としないようです.
しかし、lippmanがp 67で「NRV最適化を実施するにはcopy ctorが必要だ」と強調した理由も説明できない.
最後に侯捷は別の読者の論述を引用した.
黄俊達氏は、Lippmanがp 67の最後の行で述べた「このプログラムの最初のバージョンはNRV最適化を実施できない.test classにはcopy constructorが欠けているからだ」という言葉が間違っていると考えている.黄氏は、プログラムにexplicit copy constructorがなければ、コンパイラが自動的に私たちのために作られると考えている.(trivialの場合、直接bitwise copy、nontrivialの場合、コンパイラによってcopy constructorが合成されます)そのため、explicit copy constructorがあるかどうかはNRV最適化の実施に影響しない.彼はNRV最適化は主にコンパイラoptionによって実施するかどうかを決定すると考えている.彼はいくつかの実験を行い、VCもgccもNRV最適化ができていないと判断し、そのしない理由は技術的な困難のためではなく、避けるためである「user defined copy constructorの副作用が失効する」--副作用とは、例えば「user defined copy constructorでcout出力をする」などの「memberwise copyとは関係ない」動作を指す.
最近深くC++の対象の模型の1冊を探求して、P 67の中で最後の1段の話の第1文に対してとても理解していません
このプログラムの最初のバージョンはNRV最適化を実施できない. test classに1つ欠けています
copy constructor
この文字から見ると、コピーコンストラクタがなければNRV最適化は行われないことは理解できない.P 66ページに示された例から見ると、NRVは追加の参照型パラメータによってパラメータの戻りを最適化し、コピーコンストラクタの呼び出しがまったくないため、このコードは著者自身の論述と矛盾しているように見える.この問題に対して、私は
_
の博文第二章構造関数の意味学--NRV最適化とcopy constructorについて、いくつかの関連する答えを見つけて、文章の行文の順序を調整して、ここに置いて記録します.著者の観点
この解釈は著者
から来ている.初期のcfrontでは、コードをNRV最適化するかどうかを決定するスイッチが必要でした.これは、お客様(プログラマ)が明示的に提供するコピー構造関数があるかどうかです.お客様がコピー構造関数を提供することを表示していない場合、cfrontは、お客様がデフォルトのビット単位コピーの意味に満足していると考えています.ビット単位コピー自体が効率的であるため、NRVの最適化を実施する必要はありません.しかし、お客様が明示的にコピーコンストラクション関数を提供している場合、これは、お客様が特定の理由(例えば、深いコピーが必要であるなど)で効率的なビット単位コピーの意味から抜け出すため、コピー動作のオーバーヘッドが増大するため、NRV最適化が適用され、その結果、不要なコピー関数呼び出しが削除されることを示しています.
これは著者がそう言ったのは
cfront
のコンパイラのためだが、現在はこのようなコンパイラはあまり見られないので、この論述自体は成立せず、読者は直接この観点を無視することができる.翻訳者の観点
著者が説明した以上、他の解釈はもともとあまり必要ではなかったが、これらの観点は本の理解に一定の助けになったので、ここにも記録されている.
この本の翻訳者の侯捷さんは彼のFAQの中でこの問題について読者との討論がある.プロセスは次のとおりです.
leetronは侯捷に手紙を書いた.
質問:67ページで、一番下の2行:このプログラムの最初のバージョンは、test classにcopy constructorが欠けているため、NRV最適化を実施できません.しかし、66ページの「コンパイラレベルで最適化」に列挙されたコードは、コンパイラがxxを_result置換、_result.X::X(); すなわちdefault constructorが呼び出される.default constructorを呼び起こすのは理解できますが、コンパイラ変換後のコードはcopy constructorには使用されていません.なぜ67ページの最後の2行にcopy constructorが1つ欠けていると、この最適化は実施できませんか?
私は上の問題について少し説明したが、私の推測が正しいかどうか分からない.
私の解釈は、63ページと64ページの「戻り値の初期化」の段落のように、コンパイラは63ページの下のX bar()関数定義を64ページの仮想コードに変換することができ、そのうちの1行は_result.X::X(xx); これはcopy constructorに使用されます.
64ページのコードに変換すると、65ページと66ページには、66ページのコンパイラレベルで最適化される2つの後続の可能性のある最適化動作が記述されている.このように、66ページ最適化されたコードはcopy constructorを使用していないように見えますが、これらのコードは64ページのようなコード(注一)に基づいて最適化されていますが、copy constructorがなければ、copy constructorを呼ぶ動作があるため、64ページのような仮想コードに変換することはできません.だから、66ページはコンパイラの最適化の結果が省けましたがresult.X::X(xx); このcopy constructorの呼び出し動作(xxがまったくないため)は、copy constructorを提供することが理解されていなければ、コンパイラにこのような最適化を行うことはできません.
一方、私は第5章205ページの一番下の段落を受験しました.「一般的にあなたの設計の中には、多くの手紙が価値を伝える必要があります(by value)local class object....では、copy constructorを提供するのは合理的です.default memberwiseの意味が十分であっても、その出現はNRVの最適化をトリガーします.しかし、私が前の例で示したように、NRVの最適化後、copy constructorを喚起する必要はありません.演算結果は直接計算されているので、「転送されるobject」が体内に入っているので、上記のようにその解釈を提案しますが、正しいかどうかは不明ですので、e-mailでご確認いたします.
注一:もちろん、コンパイラがどのようにこれらの変換動作を実際に行うのかは、理論的には未知であり、一概には言えないので、私は「64ページのようなコード」を書きます.
侯捷の答えは:
まず、leetronは彼の意味をよく説明しています.私が受け取った読者からの手紙の中で、上品です.特にこのような複雑な考えを説明しています.
次にleetronが言ったことに同意します.
64ページのコードに変換すると、65ページと66ページには、66ページのコンパイラレベルで最適化される2つの後続の可能性のある最適化動作が記述されている.
しかし、私はleetronのこのような見方に同意しません.
このように、66ページ最適化されたコードはcopy constructorには使用されていないように見えるが、これらのコードは64ページのようなコード(注一)最適化によって得られるものであり、
NRV最適化は、p 63の元のコードからp 64の仮想コード、さらにp 66の最適化ではないと思います.p 63の元のコードから直接p 66の最適化に至ると思います.したがって、copy ctorを必要としないようです.
しかし、lippmanがp 67で「NRV最適化を実施するにはcopy ctorが必要だ」と強調した理由も説明できない.
最後に侯捷は別の読者の論述を引用した.
黄俊達氏は、Lippmanがp 67の最後の行で述べた「このプログラムの最初のバージョンはNRV最適化を実施できない.test classにはcopy constructorが欠けているからだ」という言葉が間違っていると考えている.黄氏は、プログラムにexplicit copy constructorがなければ、コンパイラが自動的に私たちのために作られると考えている.(trivialの場合、直接bitwise copy、nontrivialの場合、コンパイラによってcopy constructorが合成されます)そのため、explicit copy constructorがあるかどうかはNRV最適化の実施に影響しない.彼はNRV最適化は主にコンパイラoptionによって実施するかどうかを決定すると考えている.彼はいくつかの実験を行い、VCもgccもNRV最適化ができていないと判断し、そのしない理由は技術的な困難のためではなく、避けるためである「user defined copy constructorの副作用が失効する」--副作用とは、例えば「user defined copy constructorでcout出力をする」などの「memberwise copyとは関係ない」動作を指す.