Có hai điều cần được xóa tại đây.
Đầu tiên: giả định rằng malloc
giữ kích thước chính xác mà bạn đã hỏi.
Không thực sự. malloc
chỉ quan tâm đến việc cung cấp một khối đủ lớn. Mặc dù vì lý do hiệu quả, nó sẽ không thể phân bổ nhiều, nó vẫn có thể cung cấp cho bạn một khối có kích thước "chuẩn", ví dụ: khối 2^n
byte. Do đó kích thước thực (như trong, số lượng các đối tượng thực sự được phân bổ) là không rõ.
Thứ hai: "thêm chút" cần
Trên thực tế, các thông tin cần thiết cho một đối tượng nhất định phải biết cho dù đó là một phần của một mảng hay không chỉ đơn giản là sẽ là một chút thêm. Hợp lý.
Theo như thực hiện được quan tâm mặc dù: nơi bạn thực sự sẽ đặt bit đó?
Bộ nhớ được cấp phát cho chính đối tượng có thể không được chạm vào, đối tượng sẽ sử dụng nó sau khi tất cả. Vì thế ?
- trên một số nền tảng, điều này có thể được lưu giữ trong con trỏ bản thân (một số nền tảng lờ đi một phần của bit), nhưng điều này không phải là di
- nên nó sẽ đòi hỏi thêm dung lượng, ít nhất là một byte, trừ rằng với các vấn đề liên kết nó cũng có thể lên đến 8 byte.
diễn:
(không có sức thuyết phục như ghi nhận của sth, xem dưới đây)
// A plain array of doubles:
+-------+-------+-------
| 0 | 1 | 2
+-------+-------+-------
// A tentative to stash our extra bit
+-------++-------++-------++
| 0 || 1 || 2 ||
+-------++-------++-------++
// A correction since we introduced alignment issues
// Note: double's aligment is most probably its own size
+-------+-------+-------+-------+-------+-------
| 0 | bit | 1 | bit | 2 | bit
+-------+-------+-------+-------+-------+-------
Humpf!
EDIT
Do đó, trên hầu hết các nền tảng (nơi địa chỉ làm vấn đề), bạn sẽ cần phải "mở rộng" mỗi con trỏ, và thực sự tăng gấp đôi kích thước của chúng (các vấn đề liên kết).
Có thể chấp nhận cho tất cả các con trỏ chỉ lớn gấp hai lần để bạn có thể thêm một chút không? Đối với hầu hết mọi người tôi đoán nó sẽ được. Nhưng C++ không được thiết kế cho hầu hết mọi người, nó được thiết kế chủ yếu cho những người quan tâm đến hiệu suất, cho dù tốc độ hay bộ nhớ, và như vậy điều này là không thể chấp nhận được.
END OF EDIT
Vì vậy, câu trả lời đúng là gì? Câu trả lời đúng là khôi phục thông tin mà hệ thống kiểu bị mất là tốn kém. Không may.
Bạn có hỏi tại sao có 'xóa []' thay vì 'xóa' xử lý thỏa thuận và hủy bỏ mảng không? –
Nó là một chi phí nhỏ, nhưng sau đó, thu được để trả nó cũng rất nhỏ. –
Trừ khi tiêu chuẩn nói rõ ràng rằng kích thước của phân bổ được lưu trữ ở đâu đó (tôi nghi ngờ nó), nó không phải là luôn luôn cần thiết để lưu trữ kích thước được phân bổ. Lấy ví dụ sau: 'int * p = new int;' Cách duy nhất để xóa nó theo một cách xác định là gọi delete trên 'int *'. Vì vậy, kích thước được ngầm biết từ thực tế bạn biết nó là một 'int'. (Lưu ý, gọi xóa trên một 'void *' là UB: http://stackoverflow.com/a/941959/239916). –