Я отвечу ужасным, нарисованным рукой комиком. Второе изображение является причиной того, что result
является undefined
в вашем примере кода.
Ожидается, что предоставление явного размера улучшает распределение памяти, так как нет необходимости настраивать размер массива по мере добавления элементов. На практике это всего лишь намек, и есть некоторые доказательства того, что он фактически не используется (см. Статью objc.io в классах Foundation Collection).
Методы на самом деле являются частью NSMutableArray
, а не NSArray
.
. Это дает намеченную реализацию о том, сколько предметов вам нравится хранить, поэтому она может уже выделять достаточно памяти вверх роста памяти по мере необходимости, что может быть дорогостоящим, поскольку оно может включать в себя выделение, копирование из старой памяти в новую, освобождение старой памяти. И если вы добавите много элементов, это может сильно случиться, поэтому более эффективно, если NSMutableArray
может выделить требуемый объем памяти за один раз.
Помните, что это всего лишь намек и реализация может игнорировать его. Фактически, CFArray/CFMutableArray
делает игнорирование емкости при создании изменчивого массива :
static CFArrayRef __CFArrayInit(CFAllocatorRef allocator, UInt32 flags, CFIndex capacity, const CFArrayCallBacks *callBacks) {
struct __CFArray *memory;
UInt32 size;
...
switch (__CFBitfieldGetValue(flags, 1, 0)) {
case __kCFArrayImmutable:
size += capacity * sizeof(struct __CFArrayBucket);
break;
case __kCFArrayDeque:
case __kCFArrayStorage:
break;
}
...
return (CFArrayRef)memory;
}
CFMutableArrayRef CFArrayCreateMutable(CFAllocatorRef allocator, CFIndex capacity, const CFArrayCallBacks *callBacks) {
...
return (CFMutableArrayRef)__CFArrayInit(allocator, __kCFArrayDeque, capacity, callBacks);
}
Согласно , эта статья , связанная с @azsromej, NSMutableArray
также, кажется, игнорирует подсказку.
Это относится к NSMutableArray
, так как NSArray
не имеет метода arrayWithCapacity
, это также относится к initWithCapacity
:
Существует незначительное, если любое преимущество использования arrayWithCapacity
из ПОВ. Это может считаться преждевременной оптимизацией.
У этого есть недостаток или принятие некоторого времени и / или кода, чтобы придумать значение, которое очень редко дает значимое преимущество по времени и увеличивает умственную нагрузку.
Он также считается подсказкой и может использоваться или не использоваться, то есть деталь реализации, которую Apple может изменять на любом тине.
Примечание. Я провел тесты времени с подсказкой емкости и без нее и экономия времени, если таковая имеется, была крайне небольшим процентом.
Также см. ridiculousfish для получения дополнительной информации о NSArray
.
Комментарий от @bbum: «состояние просто документов устанавливает начальную емкость не так, чтобы массив выделил память для хранения всей этой емкости. Хранилище памяти Array не является линейно распределенными кусками памяти, а детали меняются с размером массива. "