Могу ли я получить размер динамически размещенного массива, как это делает `delete []`? - PullRequest
0 голосов
/ 11 декабря 2018

Мне было интересно, как delete[] знает размер динамически распределенного массива, и я нашел этот вопрос (а также этот вопрос на форуме Microsoft, но ответаналогичный).Получается, что ответ равен

Обычно он хранится в «головном» сегменте непосредственно перед выделением памяти.

Таким образом,точные детали зависят от реализации.
В этом ответе один из комментариев спрашивает, почему эта весьма полезная часть информации недоступна для программистов, что вынуждает нас передавать переменные, обозначающие размер.Ответ, полученный на комментарий:

Заставить распределитель сохранять запрошенный размер (чтобы вам не нужно было передавать размер массива самостоятельно) может быть небольшим препятствием, но это может повлиять на производительностьна мыслимых конструкциях распределителя

Для меня это не очень убедительно, учитывая, что размер в любом случае должен быть доступен для delete[].

Мой вопрос: возможно ли (для программиста) каким-то образом получить размер?

Я знаю, что есть особый способ Microsoft (как было отмечено на вышеупомянутом форуме MS), но я после чего-то стандартизировал.

Вы можете использовать специфическую для Microsoft функцию _msize (), чтобы получить размер динамически размещаемого массива из указателя, даже если он передается другой функции, отличной от той, которая выполняла распределение.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Мой вывод таков:
Размер массива может храниться в памяти, но это не обязательно так;Существуют и другие способы достижения желаемого поведения, каждый из которых имеет свои собственные компромиссы, и ISO, в частности, дает авторам компилятора свободу выбора, чтобы они могли оптимизировать его настолько, насколько это необходимо.
То есть, нетединый стандартизированный способ получения размера динамически распределенного массива на данный момент.

0 голосов
/ 11 декабря 2018

Если вы работаете с библиотеками с открытым исходным кодом, то да, вы можете!Просто посмотрите на источник, выясните, как это сделать.

Это все еще плохая идея, поскольку нет никаких гарантий: реализация может измениться в любой момент и не гарантируется, что она будет переносимой даже междуUnix и Linux.Число также может быть слишком большим, поскольку может быть выгодно выделять больше, например, для выравнивания.Это также не нужно: когда вы new пространство, вы знаете размер.Вы можете просто передать его или сохранить в каком-то месте, которое вы контролируете.Это не хуже, чем поиск через реализацию malloc.

...