cuốn sách gpt4 ai đã làm

Nên sử dụng cái nào: toán tử gán di chuyển và toán tử gán sao chép

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 23:24:05 34 4
mua khóa gpt4 Nike

Tôi dường như không thể hiểu tại sao tôi muốn sử dụngtoán tử gán di chuyển:

LỚP & toán tử=(LỚP && khác); //toán tử gán di chuyển

kết thúc rồi,sao chép toán tử gán:

LỚP & toán tử=(LỚP khác); // sao chép toán tử gán

toán tử gán di chuyểnChỉ sử dụngtham chiếu giá trị r,例如

LỚP a1, a2, a3;
a1 = a2 + a3;

hiện hữusao chép toán tử gánở giữa,othercó thể được sử dụngsao chép hàm tạohoặcdi chuyển hàm tạohàm tạo (nếu other được khởi tạo bằng một giá trị, nó có thể được xây dựng di chuyển - nếu hàm tạo di chuyển Đã xác định——).

nếu nó làđược xây dựng sao chép, chúng ta sẽ làm 1 bản và không có cách nào tránh được bản đó.

nếu nó làdi chuyển-xây dựng, thì hiệu suất/hành vi sẽ giống như hiệu suất/hành vi được tạo ra bởi tình trạng quá tải đầu tiên.

我的问题是:

1- Tại sao phải thực hiệntoán tử gán di chuyển.

2- nếuother được xây dựng từ một giá trị, thì trình biên dịch sẽ chọn giá trị nàotoán tử gán? Tại sao?

câu trả lời hay nhất

Bạn không so sánh táo với táo

Nếu bạn đang viết một cái gì đó như std::unique_ptr Đối với loại chỉ di chuyển như vậy, toán tử gán di chuyển sẽ là lựa chọn duy nhất của bạn.

Tình huống điển hình hơn là bạn có loại có thể sao chép được, trong trường hợp đó tôi nghĩ bạn có ba lựa chọn.

  1. Toán tử T&=(T const&)
  2. Toán tử T&=(T const&)Toán tử T&=(T&&)
  3. Toán tử T&=(T) và di chuyển

Lưu ý rằng việc sử dụng cả hai mức quá tải mà bạn đề xuất trong một lớp không phải là một tùy chọn vì nó tạo ra sự mơ hồ.

Tùy chọn 1 là tùy chọn C++98 truyền thống và sẽ hoạt động tốt trong hầu hết các trường hợp. Tuy nhiên, nếu bạn cần tối ưu hóa cho các giá trị r, bạn có thể xem xét tùy chọn 2 và thêm toán tử gán di chuyển.

Thật dễ dàng để xem xét tùy chọn 3 và chuyển theo giá trị rồi di chuyển, điều mà tôi nghĩ chính xác là những gì bạn đề xuất. Trong trường hợp đó, bạn chỉ cần viết toán tử gán. Nó chấp nhận các giá trị l và chỉ cần thực hiện thêm một bước để chấp nhận các giá trị r, điều mà nhiều người sẽ ủng hộ.

Tuy nhiên, Herb Sutter trong "Quay lại vấn đề cơ bản! Những yếu tố cần thiết của phong cách C++ hiện đại" Tại CppCon 2014, người ta đã chỉ ra rằng tùy chọn này có vấn đề và sẽ chậm hơn nhiều. Trong trường hợp giá trị lvalue, nó sẽ thực hiện sao chép vô điều kiện và sẽ không sử dụng lại bất kỳ dung lượng hiện có nào. Ông đã cung cấp những con số để chứng minh cho tuyên bố của mình. Ngoại lệ duy nhất là các hàm tạo, không có khả năng tái sử dụng hiện có và bạn thường có rất nhiều tham số, do đó việc truyền theo giá trị sẽ giảm số lượng quá tải cần thiết.

Vì vậy, tôi khuyên bạn nên bắt đầu với tùy chọn 1 và nếu bạn cần tối ưu hóa giá trị r thì hãy chuyển sang tùy chọn 2.

Về C++ - nên sử dụng cái nào: toán tử gán di chuyển và toán tử gán sao chép, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/26772146/

34 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress