Là một followup để this question, bộ cấp mặc định (std::allocator<T>
) là bắt buộc để thực hiện construct
như sau (theo [default.allocator]):Cấu trúc cấp phát có nên() khởi tạo mặc định thay vì khởi tạo giá trị không?
template <class U, class... Args> void construct(U* p, Args&&... args);
Hiệu ứng:
::new((void *)p) U(std::forward<Args>(args)...)
Tức là, luôn luôn khởi tạo giá trị. Kết quả của việc này là std::vector<POD> v(num)
, đối với bất kỳ loại nhóm nào, sẽ khởi tạo giá trị num
yếu tố - đó là tốn kém hơn so với các yếu tố khởi tạo mặc định num
.
Tại sao không & dagger;std::allocator
cung cấp mặc định khởi tạo quá tải bổ sung? Tức là, giống như (mượn từ Casey):
template <class U>
void construct(U* p) noexcept(std::is_nothrow_default_constructible<U>::value)
{
::new(static_cast<void*>(p)) U;
}
Có lý do để khởi tạo giá trị trong trường hợp cuộc gọi không? Nó có vẻ ngạc nhiên với tôi rằng điều này phá vỡ các quy tắc C++ thông thường, nơi chúng tôi chỉ trả tiền cho những gì chúng tôi muốn sử dụng.
& dagger; Tôi cho rằng sự thay đổi này là không thể, vì hiện tại std::vector<int> v(100)
sẽ cung cấp cho bạn 100 0
, nhưng tôi tự hỏi tại sao lại như vậy ... cho rằng người ta có thể dễ dàng yêu cầu std::vector<int> v2(100, 0)
theo cách tương tự có sự khác biệt giữa new int[100]
và new int[100]{}
.
Xem [P0040] (http: //www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0040r3.html) được chấp nhận gần đây. – FrankHB
@FrankHB Giấy đó có thay đổi thứ mà 'vector' sẽ làm ở đây không? Nó chỉ thêm thuật toán vào thư viện chuẩn phải không? – Barry
Phải. Vì vậy, nó không phải là một câu trả lời, chỉ là một bình luận. Nó cung cấp giao diện thuận tiện để dễ dàng thực hiện cách giải quyết của bạn. – FrankHB