thể trùng lặp:
What is the difference between r-value references and l-value references? (CodeGen)C++: Tham chiếu giá trị R ở cấp độ kỹ thuật (ASM) là gì?
tôi đã tự hỏi, bất cứ ai có thể giải thích những gì tài liệu tham khảo R-Value là về mặt kĩ thuật? Điều đó có nghĩa là: Điều gì xảy ra ở cấp độ lắp ráp khi các tham chiếu R-Value được tạo ra.
Đối với một thử nghiệm nhỏ để xem những gì xảy ra bên trong tôi đã viết đoạn mã sau:
char c = 255;
char &c2 = c;
char &c3 = std::move(c);
Tôi biết nó làm cho không có ý nghĩa để tạo ra một tài liệu tham khảo R-Value để 'c', nhưng chỉ vì lợi ích của thử nghiệm tôi đã làm nó anyway, để xem những gì nó làm. Và đây là kết quả:
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
Tôi đến nay không có chuyên gia nhưng tôi cho rằng, trong trường hợp này, 'c3' thường là tham chiếu đến 'c'.
Nếu tôi ràng buộc tham chiếu R-Giá trị trực tiếp đến một tạm thời (char & & c3 = 255), các bit cuối cùng của những thay đổi lắp ráp như vậy:
unsigned char &&c3 = 255;
mov byte ptr [ebp-29h],0FFh
lea eax,[ebp-29h]
mov dword ptr [c3],eax
Từ vẻ của sự thay đổi này, tôi giả rằng c3 vẫn thực sự là một tham chiếu đến một số vị trí bộ nhớ chứa giá trị 255. Vì vậy, nó là một tham chiếu thường xuyên - giá trị không được sao chép/gán cho c3. Điều này có đúng không?
Có ai có thể nói nếu giả định của tôi là chính xác hoặc nếu tôi hoàn toàn không theo dõi? Cho đến bây giờ, tôi luôn luôn nghĩ đến các tham chiếu R-Value để khớp với một chữ ký hàm/phương thức (có thể là di chuyển-ctor) khi nói đến độ phân giải gọi, để coder biết cách xử lý dữ liệu được cung cấp (cho một ctor di chuyển) sẽ di chuyển dữ liệu thay vì sao chép dữ liệu).
Để bảo vệ nỗ lực khá ngu ngốc này, tôi vừa trình bày: Tôi không định xoay quanh mã của tôi ở cấp độ asm, tôi chỉ muốn biết các tham chiếu R-Value khác biệt so với phần còn lại tât cả nhưng năm thang đo.
Mọi thông tin chi tiết và giải thích đều được hoan nghênh!
Cảm ơn!
Ở mức lắp ráp (chưa được tối ưu hóa), Giá trị R là một phiên bản của đối tượng, giống như Giá trị L, tham chiếu hoặc "giá trị". Giá trị R chỉ đơn giản là cho _compiler_ có chức năng sử dụng để sao chép/xây dựng. Điều này tương tự như cách một tham chiếu trong một đối tượng hoặc tham số thực sự chỉ là một con trỏ ở cấp độ assembly, nhưng được xử lý khác nhau _by compiler_. –
Lưu ý rằng 'c3' là tham chiếu giá trị l, không phải giá trị r. – avakar
"Kỹ thuật". Bạn tiếp tục sử dụng từ đó. Tôi không nghĩ rằng nó có nghĩa là những gì bạn nghĩ rằng nó có nghĩa là. –