問題タブ [const-reference]
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++ - Visual C++ 2013 での const 参照への代入
Visual C++ 2013 では、const 参照に一時的な値を割り当てることは合法です。たとえば、
大規模なソフトウェア プロジェクトで、実行に約 10 ミリ秒かかる 1 行のコードに出くわしました。
Itemは約 20 バイトの構造体で、instance->getItems()はconst std::vector< Item>&を返します 。この行の実行に 1 秒以上の時間がかかる理由がわかりませんでした。
も 10 ミリ秒かかりますが、
ご想像のとおり、0.00.. ms というほぼ瞬時です。
問題は、既存の複雑なソフトウェア プロジェクトでこの問題を確実に再現できることですが、凝縮された最小限の例では、両方のバージョンが同じように高速に実行されます。最適化を有効にしたリリース ビルドでこれらすべてをテストしました。これらの最適化のいずれかによって、この例外が const 参照への値の代入が非常に遅くなる可能性はありますか? この動作の原因を知りたいです。誰がこれを引き起こしているのか手がかりを持っていますか?
フォローアップとして、誤って無効にした const 参照に値を割り当てることに対する警告はありますか? もしそうなら、そのIDは何ですか?これが発生するコード内の他の場所をコンパイラが指摘できれば便利です。
編集: タイミングは、対象のコードの直前と直後の単純な CPU クロックを 1 秒あたりのクロック サイクルで割った値で行われました。あまり正確ではありませんが、10.something と 0.something の違いの一般的なアイデアを提供します。この特定の例では完全に再現可能です。実行時間に大きな違いがあります。
c++ - 関数の結果を保存するための const auto& は価値がありますか?
次のような複雑なオブジェクトを返す関数があるとしますstd::string。
そのメソッドを呼び出した結果を に保存する価値はありconst auto&ますか?
そのようなアプローチは、オブジェクトのコピー/移動を防ぎます。それでいいです。しかし一方で、auto代入の左辺を統一するために導入されました。Herb Sutter は、CppCon2014 のプレゼンテーションで、C++ の左から右へのモダンなスタイルについて言及しています https://www.youtube.com/watch?v=xnqTKD8uD64 (39:00-45:00)。
C++98 ではstd::stringat const ref を保存しても問題ありませんでした。C++11 ではどうですか?
更新 (2016-07-27 2:10 GMT+0):
申し訳ありませんが、私の質問は正確ではありませんでした。私はコーディングスタイルを意味しました - 追加するのが良いですか、const &それとも単にそのままにしautoて、コンパイラがやりたいことを何でもできるようにするのが良いですか.
更新された例:
2 つのアプローチ:
対
質問: 私たちは
const auto&複雑な戻りオブジェクトとautoプリミティブを格納するために使用する、またはautoHerb がプレゼンテーション (上記のリンク) で言及した、左から右への最新の C++ スタイルを維持するために、すべてに使用します。
c++11 - クラス メンバーへの const 参照と変数のコピーを返す定義済み関数
const 参照を返すことで、まだ少し混乱しています。おそらく、これはすでに議論されていますが、同じものを見つけられなかったので、次のコードを用意しましょう。
私が電話をかけると、正確にはどうなりますか
これは正しいです?私の観点からは、要求された構造体のコピーが作成されますよね?
一方で、
T オブジェクトが破棄されていない限り、オブジェクト メンバーへの参照を返します。これは正しいことです。私は正しいですか?
c++ - テンプレート化された数学関数は、値または const 参照を取る必要がありますか?
単純な数学関数を実装したいとします。たとえば、 (C++17's) の再実装であるとしますstd::clamp。この関数は、数値、下限、および上限を取り、それらが定義する範囲外の場合、数値をそれらの境界の 1 つに設定します。具体的な数値型の場合、たとえばint、次のように記述します。
しかし、それがテンプレートの場合、おそらく標準で使用されるサンプル実装const&では、値ではなく が使用されていることがわかります。したがって、引用を簡単にするために、次のようにします。
私の質問は次のとおりです。
T単純な数値型であるに対して const 参照を使用する利点はありますか?- 同上、単一の数値をデータメンバーとしてラップする抽象的なものである型(たとえば、
std::chrono期間)の場合は? const&比較的単純な(constexpr?)、副作用のない数学的な関数の一般的なケースで、値を取る方が(そしてまったく)良い考えなのはなぜですか?
ノート:
const&たとえば、ある種の k 次元のベクトル型、またはboost::rationals やその他の数値のような型がある場合、 a を使用することが理にかなっていることに気付きました。それでも、コンパイラはコピーを最適化しないでしょうか?- 私は、任意の C++ 関数について質問しているわけではなく、そのパラメーターを値で受け取るだけでよいかどうかを尋ねているわけではありません。それは明らかに悪い考えです。
c++ - ローカル変数をラムダから const ref に返す
このように const ref で結果を取得しても問題ありませんか?
c++ - pop() を呼び出した後、top() の戻り値が変わるのはなぜですか?
呼び出し後priority_queueの変更によって返される const 参照(visual studio 2015)top()pop()
でトップ値を取得するauto & m = queue.top();と、出力も になり3 2 1ます。
でトップ値を取得する場合auto m = queue.top();、出力は3 3 3です。
この背後にあるメカニズムは何ですか?
c++ - レシーバー関数が値をコピーするC ++のconst参照による戻り値は価値がありますか?
const 参照線量リレーによって何かを保存する場合、私はさまよっているこの状況があります。この関数は何百回も呼び出される可能性があります。
私が持っている:
intをconst参照として返す汎用コンテナ
数値を取得する関数:
d を呼び出すoSomthing().toInt():
この場合、一部のビットを節約するために const 参照を使用する理由はありますか?