Tôi đang tự hỏi những giá trị có thể có của copy-on-write là gì? Đương nhiên, tôi không mong đợi ý kiến cá nhân, nhưng các tình huống thực tế trong thế giới thực, nơi nó có thể mang lại lợi ích về mặt kỹ thuật và thực tế theo cách hữu hình. Và bằng cách hữu hình tôi có ý nghĩa gì đó hơn là tiết kiệm cho bạn cách gõ một &
ký tự.
Để làm rõ, câu hỏi này nằm trong ngữ cảnh của các kiểu dữ liệu, trong đó việc gán hoặc sao chép xây dựng tạo ra một bản sao nông ẩn, nhưng sửa đổi nó sẽ tạo ra một bản sao sâu ẩn và áp dụng các thay đổi cho nó thay vì đối tượng ban đầu.
Lý do tôi hỏi là dường như tôi không tìm thấy bất kỳ giá trị nào của việc có COW như một hành vi ngầm định mặc định. Tôi sử dụng Qt, đã thực hiện COW cho rất nhiều kiểu dữ liệu, thực tế tất cả đều có một số lưu trữ được phân bổ động bên dưới. Nhưng làm thế nào để nó thực sự có lợi cho người dùng?
Một ví dụ:
QString s("some text");
QString s1 = s; // now both s and s1 internally use the same resource
qDebug() << s1; // const operation, nothing changes
s1[o] = z; // s1 "detaches" from s, allocates new storage and modifies first character
// s is still "some text"
Chúng ta giành được gì khi sử dụng COW trong ví dụ này?
Nếu tất cả những gì chúng tôi dự định làm là sử dụng các hoạt động const, s1
là dự phòng, cũng có thể sử dụng s
.
Nếu chúng tôi có ý định thay đổi giá trị, thì COW chỉ trì hoãn việc sao chép tài nguyên cho đến lần hoạt động không phải đầu tiên, với chi phí (mặc dù tối thiểu) để tăng số lượng ref cho việc chia sẻ ngầm và tách ra khỏi bộ nhớ chia sẻ. Có vẻ như tất cả các chi phí liên quan đến COW là vô nghĩa.
Nó không khác nhiều trong bối cảnh truyền tham số - nếu bạn không có ý định sửa đổi giá trị, hãy chuyển thành tham chiếu const, nếu bạn muốn sửa đổi, bạn có thể tạo một bản sao sâu ẩn nếu bạn không muốn sửa đổi đối tượng ban đầu, hoặc chuyển qua tham chiếu nếu bạn muốn sửa đổi nó. Một lần nữa, COW có vẻ như không cần thiết mà không đạt được bất cứ điều gì và chỉ thêm một giới hạn là bạn không thể sửa đổi giá trị ban đầu ngay cả khi bạn muốn, vì mọi thay đổi sẽ tách khỏi đối tượng ban đầu.
Vì vậy, tùy thuộc vào việc bạn biết về COW hay không biết về nó, nó có thể dẫn đến mã với mục đích mơ hồ và không cần thiết, hoặc hành vi hoàn toàn khó hiểu không phù hợp với mong đợi và khiến bạn gãi đầu.
Đối với tôi có vẻ như có nhiều giải pháp hiệu quả hơn và dễ đọc hơn cho dù bạn muốn tránh một bản sao sâu không cần thiết, hoặc bạn có ý định thực hiện. Vậy đâu là lợi ích thiết thực từ COW? Tôi cho rằng phải có một số lợi ích vì nó được sử dụng trong một khuôn khổ phổ biến và mạnh mẽ như vậy.
Hơn nữa, từ những gì tôi đã đọc, COW hiện bị cấm rõ ràng trong thư viện chuẩn C ++. Không biết liệu con lừa tôi thấy trong đó có liên quan gì không, nhưng dù sao đi nữa, phải có lý do cho việc này.
[]
toán tử. Vì vậy, COW cho phép thiết kế tồi - nghe có vẻ không có lợi lắm :) Điểm trong đoạn cuối có vẻ hợp lệ, nhưng bản thân tôi không phải là một người hâm mộ tuyệt vời của hành vi ngầm - mọi người có xu hướng coi đó là điều hiển nhiên, và sau đó một thời gian khó khăn để tìm ra lý do tại sao mã không hoạt động như mong đợi và tiếp tục tự hỏi cho đến khi họ tìm ra để kiểm tra những gì ẩn đằng sau hành vi ngầm.