可能性の重複:
What is the difference between r-value references and l-value references? (CodeGen)C++:技術レベル(ASM)のR値参照とは何ですか?
私が思っていた、誰もがR-値の参照は技術的なレベルであるかを説明することができますか?つまり、R-Valueの参照が作成されたときに、アセンブラレベルではどうなりますか。私はそれが「C」にR-値の参照を作成しても意味がありませんが、知っているだけのために
char c = 255;
char &c2 = c;
char &c3 = std::move(c);
:私は、次のコードを書いたの内側に何が起こるかを見るために小さなテストのために
テスト私はとにかく、それが何かを見るためにそれをやった。そして、ここでの結果です:
unsigned char c = 255;
mov byte ptr [c],0FFh
unsigned char &c2 = c;
lea eax,[c]
mov dword ptr [c2],eax
unsigned char &&c3 = std::move(c);
lea eax,[c]
push eax
call std::move<unsigned char &> (0ED1235h)
add esp,4
mov dword ptr [c3],eax
私はこれまでありませんASMの専門家によってだが、それはこの場合には、「C3」は最終的に「C」を定期的に参照され、ように私には見えます。
私は一時的な(文字& & C3 = 255)、などのアセンブラの変更の最後のビットに直接R-値の参照をバインドする場合:この変更のルックスから
unsigned char &&c3 = 255;
mov byte ptr [ebp-29h],0FFh
lea eax,[ebp-29h]
mov dword ptr [c3],eax
、私は仮定c3は実際には値255を保持するメモリ位置への参照です。したがって、これは通常の参照です。値はc3にコピー/割り当てされません。これは本当ですか?
私の前提が正しいか、トラックから完全に外れていれば誰でも言うことができますか?これまで、R-Valueの参照は、呼び出し元の解像度に関する関数/メソッドのシグネチャ(おそらくmove-ctor)と一致するように考えられていたため、コーダは、提供されたデータをどのように扱うかを知っていますデータをコピーするのではなく、データを移動することになります)。
私はちょうど提示しました:私はレベルで私のコードでぶち壊すつもりはない、私はちょうど周りにあった残りの部分これらすべての年。
洞察と説明は歓迎すべきものではありません。
ありがとうございます!
(最適化されていない)アセンブリレベルでは、R値は、L値、参照、または「値」のように、オブジェクトのインスタンスです。 R値は、コピー/構築に使用する_compiler_関数を単に伝えます。これは、オブジェクトまたはパラメータ内の参照が、実際にはアセンブリレベルでのポインタにすぎず、コンパイラによって別の方法で扱われる方法と似ています。 –
'c3'はr値ではなくl値のリファレンスであることに注意してください。 – avakar
「技術」あなたはその言葉を使い続けます。私はそれがあなたが意味すると思うことを意味するとは思わない。 –