Có bất kỳ đảm bảo nào rằng realloc() sẽ luôn thu nhỏ bộ đệm tại chỗ không ?? Vì vậy mà sau:Realloc có được đảm bảo ở đúng vị trí khi bộ đệm bị co lại không?
new_ptr = (data_type *) realloc(old_ptr, new_size * sizeof(data_type));
sẽ luôn luôn cung cấp cho new_ptr == old_ptr nếu new_size < old_size (tất nhiên trừ khi new_size == 0). Nó có vẻ hợp lý (với tôi) rằng nó sẽ hoạt động theo cách này, nhưng tò mò liệu tiêu chuẩn có thực thi nó hay không.
Tôi nhìn vào việc tái phân bổ mảng of-phi POD kiểu dữ liệu, và nếu hành vi trên được đảm bảo đã suy nghĩ rằng chiến lược sau đây ít nhất có thể cho phép hiệu quả "thu hẹp":
if (new_size > old_size)
{
// malloc() a new buffer
// use placement copy constructor to copy old objects over
// free() old buffer
}
else
if (new_size < old_size)
{
// explicit destruction of unneeded objects
// realloc() buffer
}
tôi "m mong rằng một" co lại "tại chỗ sẽ mạnh mẽ ngay cả khi loại dữ liệu có tham chiếu/con trỏ tự hoặc bất cứ điều gì ...
Cảm ơn mọi người đã bình luận. Tôi đoán tôi chỉ tìm thấy nó khá lãng phí và không hiệu quả để phải phân bổ một bộ đệm mới và làm một bản sao đầy đủ để đạt được một "thu nhỏ" ... –
Sẽ không thêm vào điệp khúc của "không" ở đây, bạn sẽ nhận được ý tưởng của bây giờ. Nhưng một tác dụng phụ không mong muốn của việc đảm bảo rằng khối được phân bổ lại sử dụng lại cùng một bộ nhớ khi thu nhỏ là bạn không thể sử dụng [đối tượng phân bổ nhỏ] (http://www.developer.com/ws/brew/article.php/3315011 /Small-Memory-Allocation.htm) bên trong malloc/realloc, vì các trình phân bổ này nhóm các đối tượng có kích thước bằng nhau với nhau. –
Lý do khác bạn không thể mong đợi realloc luôn sử dụng lại cùng một bộ nhớ là hầu hết các mục đích chung đặt thông tin quản lý (kích thước khối, con trỏ tới khối tiếp theo trong heap) trong tiêu đề bên phải "ở phía trước" của bộ nhớ được cấp phát. Vì vậy, nếu bạn có một khối đang ngồi giữa hai khối được phân bổ và được phân bổ lại thành một từ nhỏ hơn, sẽ không có chỗ để đặt tiêu đề cho từ bộ nhớ giải phóng, làm mất hiệu quả và phân mảnh vĩnh viễn đống của bạn. –