2009-08-14 16 views
8

Tôi nhận được bối rối về các nhà xây dựng bản sao QList bởi documentation.Qt 4.5 - QList :: QList (const QList &) - đây có phải là một hàm tạo bản sao sâu không?

QList :: QList (const QList & khác) xây dựng một bản sao của khác.

Thao tác này mất thời gian không đổi, vì QList được chia sẻ hoàn toàn. Điều này giúp trả về một QList từ một hàm rất nhanh. Nếu một phiên bản được chia sẻ được sửa đổi, nó sẽ được sao chép (sao chép trên ghi) và mất thời gian tuyến tính.

Sau đó, trên liên kết về việc được chia sẻ hoàn toàn, nó nói về tính tham chiếu và sao chép trên ghi. Đây có phải là một bản sao sâu hay chỉ là một bản sao nông?

Trả lời

5

Đó là bản sao nông. Một bản sao sâu của dữ liệu xảy ra đằng sau hậu trường lần đầu tiên bạn gọi hàm không phải const trên bản sao hoặc danh sách gốc.

+0

... hoặc trên danh sách gốc! Về cơ bản, bất cứ lúc nào dữ liệu danh sách sẽ được thay đổi, một bản sao sâu được tạo ra. – Thomi

+0

Ồ, tất nhiên rồi! Cảm ơn, tôi đã chỉnh sửa câu trả lời của mình để tránh nhầm lẫn với những người không đọc nhận xét. – rohanpm

+0

Chỉ muốn theo dõi rằng tôi đã phạm sai lầm - nếu bạn giữ một QList hoặc QVector của con trỏ, không mong đợi các nhà xây dựng bản sao sâu mặc định để giúp bạn thực hiện các trường hợp mới của những gì con trỏ trỏ đến ... – Extrakun

-2

AFAIK, khi sao chép nội dung (khi viết), nó gọi hàm tạo bản sao của mỗi phần tử trong danh sách, như trong trường hợp của std :: list.

3

Thao tác này mất thời gian không đổi, vì QList được chia sẻ hoàn toàn.

Nếu bạn không sửa đổi danh sách, những thứ này được chia sẻ! Vì vậy, đằng sau hậu trường, bạn đọc tại cùng một địa chỉ các thông tin!

Nếu phiên bản chia sẻ được sửa đổi, nó sẽ được sao chép (copy-on-write) và có thời gian tuyến tính.

Nhưng nếu bạn sửa đổi danh sách sao chép, không có lựa chọn nào khác sao chép hiệu quả danh sách! Và như vậy, bạn có một chi phí tuyến tính tùy thuộc vào kích thước danh sách.

from qt doc on copy on write and shared memory :

Một bản sao sâu ám chỉ sao chép một đối tượng . Bản sao nông là bản tham chiếu , tức là chỉ là một con trỏ đến khối dữ liệu được chia sẻ . Tạo bản sao sâu có thể là tốn kém về bộ nhớ và CPU. Tạo bản sao nông rất nhanh, vì nó chỉ liên quan đến việc đặt con trỏ và tăng số tham chiếu .

Vì vậy, nếu bạn không sửa đổi danh sách bạn đọc thông tin tại cùng một địa chỉ mà danh sách được đưa làm tham số, nó được gọi là bản sao nông. Và nếu bạn sửa đổi nó, bạn sẽ có một bản sao sâu của danh sách.

2

Trình tạo bản sao thực hiện bản sao nhanh (nông). Nếu bạn sau đó sửa đổi danh sách gốc hoặc bản sao của nó, một bản sao sâu của dữ liệu sẽ được thực hiện.

Nếu bạn nghi ngờ, tôi khuyên bạn nên đọc lại tài liệu về ngữ nghĩa sao chép trên ghi.

Đây là hành vi tương tự như QString, QList, QArray và nhiều lớp Qt khác.

Các vấn đề liên quan