重複の可能性:
r値参照とl値参照の違いは何ですか?(CodeGen)
疑問に思っていたのですが、技術レベルでR値の参照が何であるかを誰かが説明できますか?つまり、R値参照が作成されたときにアセンブラレベルで何が起こるかということです。
内部で何が起こるかを確認するための小さなテストとして、次のコードを記述しました。
char c = 255;
char &c2 = c;
char &c3 = std::move(c);
'c'へのR値参照を作成することは意味がないことは知っていますが、テストのために、とにかくそれが何をするかを確認するために作成しました。結果は次のとおりです。
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」への通常の参照であるように見えます。
R-Value参照を一時(char && c3 = 255)に直接バインドすると、アセンブラの最後のビットは次のように変更されます。
unsigned char &&c3 = 255;
mov byte ptr [ebp-29h],0FFh
lea eax,[ebp-29h]
mov dword ptr [c3],eax
この変更の外観から、c3はまだ実際には値255を保持するメモリ位置への参照であると思います。したがって、これは通常の参照です。値はc3にコピー/割り当てられません。これは本当ですか?
私の仮定が正しいのか、それとも私が完全に軌道に乗っていないのか、誰かが言うことができますか?これまで、解像度の呼び出しに関しては、関数/メソッドのシグネチャ(おそらくmove-ctor)と一致するR値参照を常に考えていたため、コーダーは(move-ctorに対して)提供されたデータの処理方法を知っています。データをコピーするのではなく移動することになります)。
私が今提示したこのかなりばかげた試みを守るために、私はasmレベルでコードをいじくり回すつもりはありません。ただ、R値参照がここ数年の残りの部分と比較してどのような技術的な違いをもたらしたかを理解したいと思います。
どんな洞察や説明も大歓迎です!
ありがとう!