Здесь необходимо прояснить две вещи.
Первое: предположение, что malloc
сохраняет размер, который вы просили.
Не совсем.malloc
заботится только о предоставлении достаточно большого блока.Хотя по соображениям эффективности он, вероятно, не будет перераспределять много, он все равно, вероятно, даст вам блок «стандартного» размера, например, блок 2^n
байтов.Поэтому реальный размер (например, количество фактически выделенных объектов) фактически неизвестен.
Второе: требуется дополнительный бит
Действительно, необходимая информациячтобы данный объект знал, является ли он частью массива или нет, это просто лишний бит.Логически.
Что касается реализации, хотя: куда бы вы на самом деле поместили этот бит?
Память, выделенная для самого объекта, вероятно, не должна быть затронута, объект использует ее в конце концов,Итак?
- на некоторой платформе, это может быть сохранено в самом указателе (некоторые платформы игнорируют часть битов), но это не переносимо
- , так что это потребует дополнительныххранилище, по крайней мере, один байт, за исключением того, что при проблемах выравнивания он может составлять 8 байтов.
Демонстрация: (не убедительно, как указано в sth, см. ниже)
// 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!
РЕДАКТИРОВАТЬ
Поэтому на большинстве платформ (где адрес имеет значение) вам нужно будет "расширять" каждый указатель,и фактически удваивают их размеры (проблемы выравнивания).
Допустимо ли, чтобы все указатели были в два раза больше только для того, чтобы вы могли хранить этот дополнительный бит?Я думаю, что для большинства людей это будет.Но C ++ не предназначен для большинства людей, он в первую очередь предназначен для людей, которые заботятся о производительности, будь то скорость или память, и поэтому это недопустимо.
КОНЕЦ РЕДАКТИРОВАНИЯ
Так, каков правильный ответ?Правильный ответ заключается в том, что восстановление информации, потерянной системой типов, является дорогостоящим.К сожалению.