tôi có thể nghĩ ra một vài tình huống thực tế cuộc sống nơi xây dựng được cho phép bởi các tiêu chuẩn cả hai có ý nghĩa, và là cần thiết, tuy nhiên; Trước tiên tôi sẽ cố gắng trả lời câu hỏi này từ góc độ rộng hơn, không liên quan đến bất kỳ vấn đề cụ thể nào.
giải thích
allocators là này điều kỳ diệu trách nhiệm bố trí, xây dựng, huỷ, và thu hồi bộ nhớ và các tổ chức. Kể từ khi C++ 11 khi phân bổ stateful đi vào chơi một cấp phát có thể làm nhiều hơn trước đây, nhưng tất cả nắm bắt xuống bốn hoạt động đã đề cập trước đó.
allocators có vô số yêu cầu, một trong số họ được rằng a1 == a2
(nơi a1
và a2
là allocators cùng loại) phải nhường true
chỉ nếu bộ nhớ phân bổ bởi ai có thể deallocated bởi khác [1].
Yêu cầu trên là operator==
có nghĩa là hai trình phân bổ so sánh bằng nhau có thể làm những việc khác nhau, miễn là chúng vẫn có sự hiểu biết lẫn nhau về cách phân bổ bộ nhớ.
Ở trên là lý do tại sao tiêu chuẩn cho phép propagate_on_container_*
bằng std::false_type
; chúng ta có thể muốn thay đổi nội dung của hai thùng chứa mà các trình phân bổ có cùng hành vi deallocation, nhưng để lại hành vi khác (không liên quan đến quản lý bộ nhớ cơ bản) phía sau.
[1] như đã nêu trong [allocator.requirements]p2
(bảng 28)
THE (ngớ ngẩn) CÂU CHUYỆN
Hãy tưởng tượng rằng chúng ta có một cấp phát tên là Watericator, nó tập hợp nước theo yêu cầu phân bổ, và đưa nó vào container yêu cầu.
Máy làm nước là một trình phân bổ đầy đủ, và khi xây dựng ví dụ của chúng tôi, chúng tôi có thể chọn hai chế độ;
employ Eric, ai lấy về nước xuống ở suối nước ngọt, đồng thời cũng giải pháp (và báo cáo) mực nước và độ tinh khiết.
sử dụng Adam, người sử dụng vòi ở sân sau và không quan tâm đến việc đăng nhập. Adam nhanh hơn rất nhiều so với Eric.
Không có vấn đề nơi nước xuất phát từ chúng tôi luôn vút của nó trong cùng một cách; bằng cách tưới cây. Ngay cả khi chúng tôi có một trường hợp trong đó Eric đang cấp nước cho chúng tôi (bộ nhớ) và một nơi khác Adam
đang sử dụng vòi nước, cả hai Máy tưới nước so sánh bằng với số lượng operator==
.
Phân bổ do người khác thực hiện có thể được người khác phân phối lại.
Trên đây có thể là một similie ngớ ngẩn, nhưng hãy tưởng tượng chúng ta có một cấp phát mà không đăng nhập trên mỗi phân bổ, và chúng tôi sử dụng này trên một container ở đâu đó trong mã của chúng tôi mà bạn quan tâm chúng ta; sau đó chúng tôi muốn chuyển các phần tử ra khỏi vùng chứa này sang vùng chứa khác .. nhưng chúng tôi không còn quan tâm đến tất cả việc ghi nhật ký đó nữa.
Without allocators stateful, và các tùy chọn để chuyển propagate_on_container_*
tắt, chúng tôi sẽ buộc phải hoặc là 1) sao chép tất cả các yếu tố liên quan đến 2) bị mắc kẹt với điều đó (không longer required) khai thác gỗ.