Như bạn đã nói, std::dynarray
là dành cho một mảng động có kích thước cố định . Nó không thể thay đổi kích thước. Đại khái nó đang nói một sự cải tiến hơn new T[N]
và hơn std::unique_ptr<T[]>(new T[N])
.
Không cần thay đổi kích thước hoặc quản lý dung lượng có nghĩa là bạn có thể triển khai cấu trúc dữ liệu với ít phức tạp hơn và tốn ít dung lượng hơn.
Hơn nữa, std::dynarray
là một động vật kỳ lạ cho phép triển khai thực hiện nó theo những cách khác nhau, không cụ thể, ví dụ: có thể đặt mảng trên ngăn xếp. Gọi một hàm phân bổ là "tùy chọn". Bạn có thể chỉ định một bộ cấp phát để xây dựng các phần tử của mảng, nhưng đó không phải là một phần của kiểu.
Bạn cũng có thể thắc mắc tại sao chúng ta cần std::dynarray
và các mảng có độ dài thay đổi. VLA trong C ++ 14 hạn chế hơn nhiều; chúng chỉ có thể là biến cục bộ, biến tự động và không cung cấp cách nào để chỉ định chính sách phân bổ và tất nhiên chúng không có giao diện vùng chứa chuẩn.
Một số ví dụ từ 23.3.4.2 của "bản nháp hiện tại" (lấy đó là bộ nhớ cache của Google):
explicit dynarray(size_type c);
Hiệu ứng: Phân bổ bộ nhớ cho c
các phần tử. Có thể hoặc không thể gọi toàn cầu operator new
.
template <class Alloc>
dynarray(size_type c, const Alloc& alloc);
Hiệu ứng: Tương đương với các hàm tạo trước đó ngoại trừ mỗi phần tử được xây dựng bằng cấu trúc phân bổ sử dụng .
Việc bạn có thể sử dụng một bộ cấp phát nhất định để xây dựng các phần tử mảng hay không là một đặc điểm chung:
cấu trúc mẫu using_allocator, Alloc>: true_type {};
Yêu cầu: Alloc
phải là Bộ phân bổ (17.6.3.5). [ Lưu ý: Việc chuyên biệt hóa đặc điểm này thông báo cho các thành phần thư viện khác dynarray
có thể được xây dựng bằng bộ cấp phát, mặc dù nó không có kiểu cấp phát lồng nhau.]
Chỉnh sửa: Câu trả lời của Jonathan Wakely chắc chắn sẽ có thẩm quyền và sâu sắc hơn nhiều.