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
не может использоваться таким образом, строго говоря.