Что послужило причиной отсутствия явного хранения длины массива в массиве C
?
На мой взгляд, есть веские причины для этого, но не очень много в поддержку стандарта (C89). Например:
- Наличие длины в буфере может предотвратить переполнение буфера.
- Стиль Java
arr.length
понятен и избавляет программиста от необходимости поддерживать многоint
s в стеке при работе с несколькими массивами. - Параметры функции становятся более убедительными.
Но, пожалуй, самая мотивирующая причина, на мой взгляд, заключается в том, что обычно не сохраняется место без сохранения длины. Рискну сказать, что в большинстве случаев использование массивов связано с динамическим распределением. Правда, могут быть случаи, когда люди используют массив, выделенный в стеке, но это всего лишь один вызов функции * - стек может обрабатывать дополнительно 4 или 8 байтов.
Поскольку диспетчер кучи должен отслеживать размер свободного блока, используемого динамически размещаемым массивом, в любом случае, почему бы не сделать эту информацию пригодной для использования (и добавить дополнительное правило, проверенное во время компиляции), что нельзя манипулировать длиной явно, если не будет люблю стрелять себе в ногу).
Единственное , что я могу думать на другой стороне, что ни трекинга длина не может быть сделано компиляторы проще, но не , что гораздо проще.
* Технически, можно написать некую рекурсивную функцию с массивом с автоматическим хранением, и в этом (очень сложном) случае сохранение длины может действительно привести к эффективному использованию пространства.
malloc()
редактируемой области переносимым способом?» Это то, что заставляет меня удивляться несколько раз.