問題タブ [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++ - 右辺値参照を const 左辺値参照パラメータに渡す
C++11の右辺値参照と、コードで最適なパフォーマンスを得るためにそれらを使用する方法を理解しようとしています。
A
動的に割り当てられた大量のデータへのメンバー ポインターを持つクラスがあるとします。
さらに、foo(const A& a)
class のオブジェクトで何かを行うメソッドA
。
のオブジェクトがfunction に渡されたときに、 のコピー コンストラクターA
が呼び出されないようにしたいと考えています。その場合、基になるヒープ データのディープ コピーが実行されるためです。A
foo
左辺値参照を渡すことをテストしました:
そして右辺値参照を渡します:
どちらの場合も、コピー コンストラクターは呼び出されませんでした。
これは予想どおりですか、それともコンパイラ (Apple LLVM 5.1) の最適化によるものですか? これに関する仕様はありますか?
c++ - サブクラスの const 参照を返す
私が知っていること
一時オブジェクトの const 参照を返すことは問題ないことを知っています! (この例のように:)
しかし!
私がそれをしたいのなら、それはまだ正しいです:
はいと思いますが、実行時には、返されたオブジェクトはまだ A オブジェクトと見なされます (この例のように:)
main.cpp
出力
それはB..イェーイ..しかし、この警告は非常に恐ろしいです....
編集
あなたのおかげで、私は自分のエラーを見ていることを知っています...しかし、それについて他のことを知りたいです...
これが実行されると、スタック内で正確に何が起こっているのでしょうか?
c++ - const 参照がテンポラリにバインドされている場合、スタックはどうなりますか?
C++ 標準では、const 参照を右辺値にバインドできるため、参照がスコープ外になるまで、一時オブジェクトの有効期間が延長されます。ただし、これが実際にどのようにコンパイルされているのかわかりません。例を挙げて説明しましょう。
私の知る限り、例として x86 アーキテクチャを使用すると、最初に関数foo()
が呼び出され、文字列オブジェクトがスタックに構築されます。つまり、必要な量のスペースがrsp
レジスタから差し引かれます (64ビット アーキテクチャ); その後、rsp
レジスタは元の値に戻り、関数foo()
が埋めていたスタックスペースを解放します。正しく理解できれば、への呼び出しbar()
はそのスタックスペースを使用して を構築しVeryBigObject
、文字列を上書きします。
foo()
これらすべてを念頭に置いて、アセンブリ ドメインでを呼び出した後、文字列の寿命を延ばすにはどうすればよいでしょうか?
c++ - const 参照を使用した変数のエイリアス
配列から取得したインスタンスを処理しT
たり、その他の長い構文を使用したりする場合const T&
、オブジェクトに別名を付けてコードを読みやすくするために a を使用することがよくあります (もちろん、オブジェクトの有効期間が許す場合のみ)。私はこれを別の場所で見たことがあります。たとえば、 Stefan Reinalter の優れたブログです。彼のコードを削除してコメントしたバージョン:
これにより、追加の指示が発生することはありますか?それとも、すべての状況下でm_subMeshes[i].startIndex
直接m_subMeshes[i].numIndices
アクセスすることと同じでしょうか?
c++ - 型キャスト時にVisual Studioが一時オブジェクトを作成していませんか?
私は Visual Studio Express 2013 を使用しており、C++ でさまざまなことを学ぼうとして少し浮気しています。
コンパイラで、参照と同じ型に明示的に型キャストしたときに一時オブジェクトが作成されないように見える興味深いバグを見つけました。
これを VS でコンパイルすると、次の出力が得られます: 3 3 2 2
ただし、gcc でコンパイルすると、次の出力が得られます: 3 2 2 2
「int number;」を置き換えると 「浮動小数点数;」VSに入る: 2 2 3 3
そしてgccの場合:2 2 3 2
誰かがこれをバグとして確認できるかどうか、また実行可能な回避策/解決策を誰かが知っているかどうか疑問に思っています。
c++ - 非型テンプレート引数としての const 文字列参照
非型テンプレート引数として const 文字列参照を使用しようとしていますが、このコンパイル エラーを回避できません。
test.h :
test.cpp :
コンパイル エラー:
次のgccコマンドを使用して、centos linuxでコンパイルしています
c++ - コンストラクターと const リファレンス
私は現在 C++ を勉強しています (2 日前のように始めました) が、Node.js のコピー C'tor を書くのに問題があります。ノードは次のようなクラスです:
注: 私は operator* を持っているので、 *dummy は T 型になります。
別の注意: 私の公開フィールドと非公開フィールドは間違っている可能性がありますが、後で対処します。
少し吐いたら、コピー C'tor を見てみましょう。
ノードの const 参照を取得し、それへのポインターを作成しようとしました。コンパイラはエラーを出力します:
Node<T>* dummy= &node;
results invalid conversion from 'const Node<int>*' to 'Node<int>*'
(作成しようとしている短いメインがありますNode<int>
)。
わかりましたので、constへのポインタを作成できないようですので、コードに示されているようにフィールドを手動でコピーしようとしました。Eclipse デバッガーを実行して動作するかどうかを確認すると、動作します。ただし、ステップを作成し続けると、D'tor が先頭で (コピー コンストラクターの最後で) 呼び出され、その結果、すべてがバラバラになります。そのため、次に何をすべきか、あるいは自分のやり方が正しいかどうかさえわかりません。
コピー コンストラクターはどのように作成すればよいですか? D'tor が呼び出される理由は理解できたと思います (私は何かを作成し、ブロックの最後で何かが破壊されました - ですよね?) が、それを正しくする方法がわかりません。