Để biết ngữ nghĩa di chuyển là gì?

lập trình


Xin chào, thực ra tôi đang cố gắng hiểu về ngữ nghĩa của chuyển động, nhưng thực tế là tôi không hiểu được lý thuyết. Chỉ có một nghi ngờ là ngữ nghĩa di chuyển di chuyển như thế nào bcz trong hàm tạo di chuyển đang sử dụng hàm di chuyển, lý thuyết nói rằng việc chuyển quyền sở hữu sang tài nguyên khác có nghĩa là hàm tạo bản sao sẽ gọi đúng. Tôi không biết cách di chuyển Trình xây dựng hoạt động như thế nào nhưng nó cần phải sao chép đúng. Vì vậy, hãy giúp tôi cách hoạt động của ngữ nghĩa di chuyển và thông tin về địa chỉ của đối tượng sau hàm tạo di chuyển, vui lòng mô tả chi tiết.

Những gì tôi đã thử:

Đã cố gắng tìm hiểu về ngữ nghĩa di chuyển và có một số nghi ngờ.

Giải pháp 1

Để hiểu ngữ nghĩa di chuyển, trước hết bạn phải hiểu đối tượng tạm thời là gì. Nghĩa là, bất kỳ đối tượng nào được tạo nhanh chóng và sau đó sẽ bị loại bỏ ngay lập tức:

C++
class A{/*assume it has functionality*/};

A a; // Solid object
A a1 = A(/* constructor parameter(s)*/); // Where as a1 is solid, the RValue assignment is a temporary objest which is when discarded triggers destructor semanticts

Vì vậy, ngữ nghĩa di chuyển nói Di chuyển A() thành a1, không sao chép giống như có 2 đối tượng tạm thời chiếm bộ nhớ.

Điều đó có thể hoạt động ngay cả khi không có ngữ nghĩa di chuyển, với điều kiện là hàm tạo bản sao và công cụ gán thích hợp được triển khai. Nhưng ngữ nghĩa di chuyển sẽ loại bỏ các bản sao dư thừa, chẳng hạn như đối tượng có kích thước rất lớn.

Giải pháp 2

Tôi đề cập đến ngữ nghĩa di chuyển trong một trong những bài viết của mình

[^]

Ngữ nghĩa di chuyển về cơ bản là “di chuyển” trạng thái bên trong của một đối tượng sang một đối tượng khác trong những trường hợp phù hợp, do đó tránh được việc phải tạo một đối tượng mới và sao chép trạng thái của nó.

Trình biên dịch sẽ xác định điều này trong quá trình biên dịch. Nó xem xét bài tập của bạn và dựa trên việc nó có coi biến nhất định là ‘tạm thời’ hay không, nó có thể ‘di chuyển’ trạng thái bên trong của biến tạm thời sang giá trị đích của bạn mà không cần phải thông qua hàm tạo bản sao.

Tuy nhiên, hãy lưu ý rằng điều này không phải lúc nào cũng an toàn. Nếu triển khai sai, điều này có thể dẫn đến rò rỉ bộ nhớ nếu đối tượng đích không loại bỏ đúng cách các tài nguyên bên trong của nó trước khi chúng bị ghi đè.

コメント

タイトルとURLをコピーしました