Стандартизировать способ определения размера выделенной памяти.

Дмитрий
Дмитрий

Для Win32 есть _msize:

size_t _msize(void *block);
Returns the size of a heap block.
_msize returns the size of the allocated heap block whose address is block. The block must have been allocated with malloc, calloc, or realloc. The returned size can be larger than the number of bytes originally requested when the block was allocated.

Однако стандартного кросплатформенного способа определить размер выделенной под массив памяти нет. Тем не менее, данная величина сохраняется, обычно в 32/64 битах непосредственно перед выделенным блоком, и могла бы использоваться и для иных целей, помимо выполнения delete[]. Предлагаю исправить данную негибкость языка.

1
рейтинг
6 комментариев
croessmah
_msize, как видно из описания, может возвращать значение больше, чем Вы запросили памяти.
Если отталкиваться от реализации, когда число выделенных элементов (там хранится число элементов, для корректного вызова деструкторов, а не количество выделенных байт) хранится перед выдаваемым пользователю участком памяти, то, даже для этой реализации, не ясно что делать для одного элемента, т.е. когда память выделялась с помощью new, а не new[].
croessmah
Дмитрий
croessmah, выбирать в любом случае уже приходится, между delete и delete[]. Разумеется должно быть и два варианта метода определения выделенной памяти.
Дмитрий
croessmah
Также стоит учитывать, что operator new может быть перегружен.
croessmah
Павел Корозевцев
обычно, когда предлагают сделать что-то более корсс платформенным, предъявляют, что на большинстве платформ это и так уже есть. вы показали способ для шиндошс, но для других платформ я что-то не знаю такого. буду очень рад узнать, если такое возможно на FreeBSD, например.

опять же, что делать, если прилинкован странный malloc?
Павел Корозевцев
Дмитрий
> когда предлагают сделать что-то более корсс платформенным
Я не предлагаю сделать что-то более кроссплатформенным.
> о для других платформ я что-то не знаю такого
Для других платформ никто и не знает, потому что решения нет, и об этом я и пишу.
> что делать, если прилинкован странный malloc?
Тогда должен быть прилинкован и странный free и странный .... get_heap_block_size.
Дмитрий
yndx-antoshkka
Близкое по теме обсуждение вот тут stdcpp.ru/proposals/3b0072f1-61f2-4b78-beab-9d3e1bacfe51

Нужен прототип, работающий на большинстве платформ. И нужно показать, что с ним std::vector начинает работать быстрее. И да, тема - огонь :) Помогу с написанием предложения, или сведу с нужными людьми, как будет прототип.
yndx-antoshkka
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).