2013-06-25 22 views
9

Tôi chỉ đọc a Wikipedia article on Copy-on-write (tò mò nếu có bất kỳ hệ thống tập tin hỗ trợ nó), và đã rất ngạc nhiên bởi những đoạn văn sau:hỗ trợ Copy-on-viết trong STL

COW cũng được sử dụng bên ngoài hạt nhân, trong thư viện, ứng dụng và mã hệ thống. Lớp chuỗi cung cấp bởi thư viện chuẩn C++, ví dụ, được thiết kế đặc biệt để cho phép triển khai copy-on-write:

std::string x("Hello"); 

std::string y = x; // x and y use the same buffer 

y += ", World!"; // now y uses a different buffer 
        // x still uses the same old buffer 

Tôi không biết rằng copy-on-write được mỗi hỗ trợ trong STL . Điều đó có đúng không? Nó có áp dụng cho các lớp STL khác không, ví dụ: std::vector hoặc std::array? Trình biên dịch nào hỗ trợ tối ưu hóa đó (đặc biệt, tôi tự hỏi về G ++, trình biên dịch C++ của Intel và trình biên dịch C++ của Microsoft)?

+1

Trên thực tế, 'std :: chuỗi' có thể không được sao chép-on-viết nữa, xem [ở đây] (http: // stackoverflow .com/a/16093748/256138). – rubenvb

+0

Các yêu cầu đặt trên 'std :: vector' và' std :: array' loại trừ COW cho các loại đó. Và các yêu cầu áp đặt trên 'std :: string' trong C++ 11 cũng loại trừ COW cho các chuỗi. – juanchopanza

+0

Một ví dụ về trình biên dịch hỗ trợ copy-on-write là Visual C++ 6.0. Nhưng không được hỗ trợ nữa kể từ phiên bản mới hơn. Như đã nói, không được hỗ trợ nữa. – Gonmator

Trả lời

7

Lớp chuỗi cung cấp bởi Thư viện C++ chuẩn, ví dụ, được thiết kế đặc biệt để cho phép triển khai copy-on-write

Đó là nửa sự thật. Có, nó bắt đầu thiết kế với COW trong tâm trí. Nhưng trong vội vàng giao diện công cộng của std :: string đã được sai lầm. Kết quả là nó nhận được COW-thù địch. Các vấn đề đã được phát hiện sau khi tiêu chuẩn được xuất bản, và chúng tôi đang bị mắc kẹt với điều đó kể từ đó. Như hiện tại std::string không thể được thread-an toàn COW-ed và triển khai trong tự nhiên không làm điều đó.

Nếu bạn muốn dùng chuỗi COW, hãy lấy nó từ thư viện khác, như CString trong MFC/ATL.