Зачем использовать фиксированную длину вместо стати c? - PullRequest
2 голосов
/ 19 марта 2020

Я понимаю, что то, что я спрашиваю, может быть довольно простым для некоторых из вас, но потерпите меня, я пытаюсь понять управление памятью. Поскольку мы используем определенную фиксированную длину (N) для размера, почему мы также делаем это:

int *arr = (int*)malloc(N * sizeof(int))

.. вместо обычного stati c way:

int arr[N];

Ответы [ 3 ]

3 голосов
/ 19 марта 2020

malloc предоставляет память, которая остается доступной после выполнения блока, в котором она находится, например, когда возвращается функция, в которую она возвращается.

int A[N], если она появляется внутри функции, использует память он гарантированно будет доступен только тогда, когда выполнение блока, в котором он находится, еще не завершено. Если он появляется вне функции, память доступна для всего выполнения программы, но N должно быть константой. (Кроме того, даже внутри функции int A[N], где N не является константой, не поддерживается в некоторых C реализациях.)

В типичных C реализациях в операционных системах общего назначения malloc имеет большой объем доступной памяти, но int A[N] внутри функции использует область стека, которая ограничена, обычно от одного до восьми мегабайт, в зависимости от системы.

3 голосов
/ 19 марта 2020

int arr[N]; отправляется либо в стати c памяти, если он находится в файловой области (или перед static), либо в стеке.

Стати c -память int arr[N]; является самым дешевым выделять (как с точки зрения размера, так и времени выделения), но его нельзя освободить, и память не всегда будет локальной для кэша.

Если int arr[N]; находится внутри блока (и ему не предшествует) на static) int arr[N]; идет в стек. Эта память наверняка будет локальной для кэша, но вы можете не использовать sh эту форму, если N большой и ваш стек ограничен (или вы рискуете переполнением стека) или если время жизни arr должен превышать объем содержащегося в нем блока.

malloc 'памяти требуется некоторое время для выделения (от десятков до сотен нс), он может нести некоторый объем служебной информации, и распределение может произойти сбой, но вы может free память позже, и она останется, пока вы не сделаете free это. Он также может быть изменяемого размера (через realloc) без необходимости копировать память. С точки зрения кэширования, это что-то вроде stati c памяти (т. Е. Блок может быть потенциально удален от конца кэша в стеке).

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

Последнее замечание может быть характерной чертой C: эффективного типа . Объявленный массив имеет фиксированный эффективный тип и поэтому не может быть перепечатан без нарушения строгих правил псевдонимов C, но память malloc может иметь место. Другими словами, вы можете использовать блок malloc в качестве резервного хранилища для собственного распределителя c, но объявленный массив char не может использоваться таким образом, строго говоря.

1 голос
/ 19 марта 2020

malloc. Это динамическое распределение c. Вы можете освободить или изменить размер выделенной памяти. Куча обычно намного больше, чем область памяти стека или глобальных переменных. Память имеет ту же продолжительность хранения, что и stati c objects

. Размер последнего не может быть изменен или освобожден (за исключением автоматических c объектов, выходящих из области действия). Статистическое хранилище c и автоматическое c обычно меньше кучи.

...