Thay đổi kích thước trong C++ là khó xử vì nhu cầu tiềm năng để gọi hàm tạo và hàm hủy.
Tôi không nghĩ rằng có một lý do cơ bản tại sao trong C++ bạn không thể có một nhà điều hành resize[]
đi với new[]
và delete[]
, mà đã làm một cái gì đó tương tự như sau:
newbuf = new Type[newsize];
std::copy_n(oldbuf, std::min(oldsize, newsize), newbuf);
delete[] oldbuf;
return newbuf;
Rõ ràng oldsize
sẽ được lấy ra từ một vị trí bí mật, giống như vậy là trong delete[]
và Type
sẽ đến từ loại toán hạng. resize[]
sẽ không thành công khi Loại không thể sao chép được - điều này là đúng, vì các đối tượng như vậy không thể di chuyển được. Cuối cùng, mã trên mặc định xây dựng các đối tượng trước khi gán chúng, mà bạn sẽ không muốn như là hành vi thực tế.
Có tối ưu hóa có thể ở đó newsize <= oldsize
, để gọi hàm hủy đối với các đối tượng "quá giới hạn" của mảng mới được điều chỉnh và không làm gì khác.Tiêu chuẩn sẽ phải xác định liệu tối ưu hóa này có cần thiết hay không (như khi bạn resize()
một véc tơ), được phép nhưng không được chỉ định, được phép nhưng phụ thuộc vào việc triển khai hoặc bị cấm.
Câu hỏi mà bạn nên tự hỏi là "thực sự hữu ích khi cung cấp điều này, và cũng được thiết kế đặc biệt để cung cấp vùng chứa có thể thay đổi kích thước (bộ nhớ tiếp giáp - yêu cầu đó được bỏ qua C++ 98 nhưng cố định trong C++ 03) đó là một phù hợp hơn so với mảng với C + + cách làm việc?
Tôi nghĩ câu trả lời được cho là rộng rãi "không". Nếu bạn muốn làm bộ đệm có thể thay đổi theo cách C, hãy sử dụng malloc/free/realloc
, có sẵn trong C++. Nếu bạn muốn thực hiện các bộ đệm có thể định lại theo cách C++, hãy sử dụng một vectơ (hoặc deque
, nếu bạn không thực sự cần bộ nhớ tiếp giáp). Đừng cố gắng kết hợp cả hai bằng cách sử dụng new[]
cho bộ đệm thô, trừ khi bạn đang triển khai vùng chứa giống vectơ.
Nguồn
2010-08-14 12:36:58
Stroustrup đã trả lời điều này một thời gian dài, xem: http://www2.research.att.com/~bs/bs_faq2.html#renew (Đó là một khởi đầu tốt nếu bạn mới dùng C++ cùng với Cline's C++ FAQ.) – dirkgently
Câu trả lời được tham chiếu bởi @dirkgently hiện có tại: http://www.stroustrup.com/bs_faq2.html#renew - và Câu hỏi thường gặp của Cline hiện là một phần của Câu hỏi thường gặp về siêu: https://isocpp.org/faq – maxschlepzig