問題タブ [nrvo]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 戻り値による戻り値へのconst参照の使用
次の例を見てください。
私はRVOとNRVOを知っていますが、それを行うには、次のようにバーを書く必要があると思いました。
どちらのバージョンも機能しているようで、同じパフォーマンスであると思います。最初のバージョン(const参照付き)を使用しても安全ですか?
ありがとう。
c++ - どの関数構造が優れていますか?
次のコードを見てください。
関数f2
は、オブジェクトを返す通常の形式です。NRVOが適用される可能性があり、追加のコピーコンストラクター呼び出しを回避できます。f1
右辺値参照を使用する新しいフォームです。NRVOをサポートしていないが右辺値参照をサポートしているシステムの場合、コピーコンストラクターではなく、移動コンストラクターが呼び出されます。これは、ほとんどの場合に適していると見なされます。
問題はf1
次のとおりです。この場合、NRVOをサポートするコンパイラはありますか?やっぱり将来的にはもっといい形になりそうです。
c++ - スコープの導入中にコピー c-tor への余分な呼び出しを取得する
元のコード
出力は0
、名前付き戻り値の最適化をサポートする最適化されたコンパイラで行われます。
の定義を変更するfoo
と
出力として取得1
します。つまり、コピー c-tor が 1 回呼び出されます。考えられる理由は何ですか?ダミー スコープを導入すると、コードの動作が完全に変わります。私は何が欠けていますか?
g++ コンパイラでテストしました。実装固有の方法でシナリオを説明できるコンパイラ担当者はいますか?
編集
clang でテストしたところ、2 番目のケースでもコピー c-tor の呼び出しが最適化されました。
Andrew Pinski (gcc 担当者) は、これが実際に g++ の最適化を逃したケースであることを確認しました。
c++ - 戻り値の最適化 - C++ - デストラクタ呼び出し
次のコードは、デストラクタを 4 回呼び出します。
出力:
誰か説明してもらえますか?デストラクタの呼び出しは 3 つだけにすべきだと考えていました。
c++ - RVO/NRVO の起動時にオブジェクトがコピーされるかどうか。
RVO (および NRVO) の定義について理解できません。これは、RVO がコピー コンストラクターを省略していると仮定して、このような質問が複数あるためです。12.8.15によると
このような場合、実装は、省略されたコピー操作のソースとターゲットを、同じオブジェクトを参照する 2 つの異なる方法として扱い、そのオブジェクトの破棄は、2 つのオブジェクトが削除されなかった場合に発生します。最適化。
コピー コンストラクターの呼び出しが省略されているのではなく、コピー自体が省略されているように見えます。最初にオブジェクトが「コピー」の場所に構築されるだけなので、「元の」オブジェクトはなく、コピーもまったくありません。したがって、クラスにprivate
コピー コンストラクターがある場合でも、コピーがないため、RVO が開始されたときに関数から返される可能性があります。
私はそれを正しく理解していますか?コピー自体が省略されているか、コピーコンストラクタの呼び出しが省略されていますか? オブジェクト クラスにプライベート コピー コンストラクターがある場合、関数からオブジェクトを返すことを許可する必要がありますか?
c++ - (N)RVOの完全な例
私は (N)RVO について読んでいて、1 つの完全なシナリオの説明が欲しいです。この質問が他の C++ 学習者のアイデアを明確にするのに役立つことを願っています。
次のシナリオを想定します。
C++11 の move-semantics はしばらく無視してください。
- (N)RVO が実行されない場合、いくつのコンストラクター/代入/デストラクタが実行されますか? (それらが参照するオブジェクトを指摘してください)
- (N)RVOを適用すると何が変わる?
std::string
最後に、移動セマンティクスをサポートするC++11 で状況がどのように変化するかを説明します。
c++ - std :: pairを返すときにRVOは発生しますか?
関数は、呼び出し元に2つの値を返す必要があります。実装するための最良の方法は何ですか?
オプション1:
オプション1.1:
オプション2:
Option2では、コピー/移動はありませんが、見た目は醜いです。Option1、1.1でコピー/移動は発生しますか?UとVがコピー/移動操作の両方をサポートする巨大なオブジェクトであると仮定しましょう。
Q:標準に従ってRVO / NRVOの最適化を理論的に行うことは可能ですか?はいの場合、gccまたは他のコンパイラはまだ実装されていますか?
c++ - msvcで戻り値の最適化を強制する方法
クラスに関数があり、デバッグモードでもコンパイラにNRVOを常に使用させたいと思っています。このためのプラグマはありますか?
これが「リリース」モードでうまく機能する私のクラスです。
このクラスは、_cbStackバイトを超える必要がない限り、スタック上にバッファーを作成するために使用されます。次に、破壊するときに、割り当てられている場合はメモリを解放します。文字列バッファを必要とするc関数とインターフェイスするときに便利であり、最大サイズがわからない場合に便利です。
とにかく、私はこのテストのように、CBufferを返すことができる関数を書き込もうとしていました。
私はfoo()を高速にするためにNRVOを頼りにしていました。リリースモードでは、うまく機能します。デバッグモードでは、クラスにコピーコンストラクターがないため、明らかに失敗します。CBufferは、すべてを50回コピーしたい開発者によって使用されるため、コピーコンストラクターは必要ありません。(Rant:これらの人は動的配列クラスを使用してWideCharToMultiByte()に渡す20文字のバッファーを作成していました。スタックに文字の配列を割り当てることができることを忘れているようです。彼らはスタックが何であるかさえ知っています...)
コードがデバッグモードで動作するように、コピーコンストラクターをコーディングしたくありません。それは巨大で複雑になります:
このプラグマは機能しません:
何か案は?
c++ - C ++コンパイラはconstの戻り値に対してRVOを実行できますか?
私が機能を持っているとしましょう
とのタイプが-nessの違いのためにの戻りタイプとは異なるt
場合でも、コンパイラはの(名前付き)戻り値の最適化を実行できますか?s
t
foo
const
(C++03とC++11で答えが異なる場合は、C ++ 03の答えを知ることに間違いなく興味があります。)
c++ - 次のコードがコピーコンストラクターも呼び出すのはなぜですか?
g_Fun()
実行時にreturn temp
コピーコンストラクターが呼び出されるのはなぜですか?