Ví dụ thế giới thực: std::vector
phân bổ quá đủ bộ nhớ để lưu lượng tải hiện tại của nó, để giảm chi phí trung bình của push_back
.
Nếu lưu trữ bộ đệm T*data
thì hãy gọi data=new T[capacity]
sẽ mặc định xây dựng tải trọng đối tượng T
. Rắc rối là, ngữ nghĩa của vector
là nó chỉ chứa những gì bạn đã đưa vào nó: chúng tôi có thể preallocate bộ nhớ cho các đối tượng của chúng tôi nhưng những đối tượng không nên tồn tại chưa.
Giải pháp là đặt thành viênthành void*
và cấp phát bộ nhớ chưa được nhập cho nó. Bây giờ bất cứ khi nào chúng ta thêm một đối tượng vào thùng chứa, chúng ta cần phải xây dựng nó để đưa đối tượng này vào sự tồn tại và đưa ra ý nghĩa cho con trỏ thô.
template <typename T>
void vector <T> :: push_back (const T & value)
{
resize (m_size + 1);
// construct a new T in the void buffer.
new (reinterpret_cast <T*> (m_data) + m_size) T (value);
++ m_size;
}
template <typeame T>
void vector <T> :: pop_back()
{
(reinterpret_cast <T*> (m_data) + m_size) -> ~ T();
-- size;
}
Như câu trả lời cho biết, đó là vị trí mới. Lý do * thực tế * để viết điều này có thể là cung cấp một giao diện tương thích C cho một thư viện C++, mặc dù các ứng dụng khác (ví dụ như ví dụ về vector std :: của tôi) thông thường hơn một chút. – spraff