2011-07-28 16 views
11

Trong một lớp học tôi đang làm việc, tôi đang tung hứng một số QList s. Tôi đã nghe nói rằng Qt cố gắng không để làm cho bản sao sâu của danh sách bất cứ khi nào có thể. Từ những gì tôi hiểu, đó có nghĩa là không có bản sao sâu xảy ra khi bạn làm điều này:Khi nào một bản sao sâu xảy ra với một QList?

QList<int> myList; 
myList << 1 << 2 << 3 << 4; 
QList<int> otherList = myList; // No deep copy 

Trong một số trường hợp, tôi cần phải chắc chắn một bản sao sâu không bao giờ xảy ra với QList. Chính xác loại hoạt động hoặc hành động nào tôi cần phải đảm bảo tránh để đảm bảo bản sao sâu không bao giờ xảy ra với một QList Tôi đang làm việc cùng?

Trả lời

13

Các nhà quản lý được triển khai sử dụng implicit sharing.

Phân công đối tượng (với toán tử =()) cho đối tượng được chia sẻ hoàn toàn là được triển khai bằng bản sao nông.

Điều này có nghĩa là việc chuyển nhượng sẽ không bao giờ làm sao chép dữ liệu được chứa. Tuy nhiên, việc ghi vào một cá thể được chia sẻ sẽ làm cho đối tượng nguồn được sao chép. Mẫu này thường được gọi là copy-on-write.

Vì vậy, để trả lời câu hỏi của bạn, nếu bạn không bao giờ viết thư cho các trường hợp được chia sẻ thì chúng sẽ không bao giờ được sao chép. Nếu bạn muốn ngăn chặn hoàn toàn các bản sao được tạo ra thì lấy từ QList và ghi đè lên và ẩn nhà xây dựng bản sao và toán tử gán.

2

Khi bạn chuyển QList làm đối số của hàm hoặc khi bạn tạo bản sao mà không sửa đổi Qt, chỉ cần chuyển "trình bao bọc", dữ liệu thực sẽ không bao giờ được sao chép. Chia sẻ ngầm định là việc triển khai Qt của mẫu Flyweight, xem here.

1

Chỉ cần đảm bảo sử dụng constBegin(), constEnd(), chuyển qua tham chiếu const, không sửa đổi hoặc sao chép.

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