Почему в C нет «memsize», который возвращает размер блока памяти, выделенного в куче с помощью malloc? - PullRequest
6 голосов
/ 10 февраля 2011

ки.Его можно вызывать как угодно, как в _msize в Visual Studio.

Но почему в стандарте не возвращается размер памяти с учетом блока памяти, выделенного с помощью malloc?Поскольку мы не можем сказать, на какой объем памяти указывает указатель возврата после malloc, мы можем использовать этот вызов memsize, чтобы вернуть эту информацию, если она нам понадобится.«memsize» будет зависеть от реализации, как и malloc / free

Просто спрашиваю, когда мне нужно было написать оболочку когда-нибудь, чтобы сохранить дополнительные байты для размера.

Ответы [ 4 ]

8 голосов
/ 10 февраля 2011

Поскольку библиотека C, включая malloc, была разработана с минимальными издержками.Функция, подобная той, которую вы хотите, потребовала бы, чтобы реализация записывала точный размер выделения, в то время как реализации теперь могут выбирать «округлять» размер по своему усмотрению, чтобы предотвратить фактическое перераспределение в realloc.

* 1004.* Сохранение размера требует дополнительных size_t на выделение, что может быть тяжелым для встроенных систем.(И для PDP-11 и 286, которые были все еще многочисленны, когда был написан C89.)
4 голосов
/ 10 февраля 2011

Чтобы перевернуть это, почему это должно быть? В стандартах уже много всего, в частности, стандарта C ++. Какие у вас варианты использования?

Вы запрашиваете кусок памяти адекватного размера и получаете его (либо нулевой указатель, либо исключение). Могут быть или не быть выделены дополнительные байты, и некоторые из них могут быть зарезервированы. Концептуально это просто: вы спрашиваете, чего хотите, и получаете то, что можете использовать.

Зачем это усложнять?

2 голосов
/ 10 февраля 2011

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

1 голос
/ 10 февраля 2011

В C ++ оболочка, о которой вы говорите , предоставляется стандартом. Если вы выделите блок памяти с помощью std :: vector , вы можете использовать функцию-член vector :: size () , чтобы определить размер массива, и использовать vector :: Capacity () для определения размера распределения (который может отличаться).

C, с другой стороны, является языком низкого уровня, который оставляет разработчикам такие проблемы, поскольку динамическое отслеживание (как вы предлагаете) не является строго необходимым и во многих случаях будет избыточным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...