разница между [NSMutableArray array] и [NSMutableArray arrayWithCapacity:] [duplicate]

Я отвечу ужасным, нарисованным рукой комиком. Второе изображение является причиной того, что result является undefined в вашем примере кода.

6
задан Neeku 25 July 2014 в 15:27
поделиться

3 ответа

Ожидается, что предоставление явного размера улучшает распределение памяти, так как нет необходимости настраивать размер массива по мере добавления элементов. На практике это всего лишь намек, и есть некоторые доказательства того, что он фактически не используется (см. Статью objc.io в классах Foundation Collection).

8
ответ дан azsromej 26 August 2018 в 13:15
поделиться

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

2
ответ дан DarkDust 26 August 2018 в 13:15
поделиться

Это относится к NSMutableArray, так как NSArray не имеет метода arrayWithCapacity, это также относится к initWithCapacity:

Существует незначительное, если любое преимущество использования arrayWithCapacity из ПОВ. Это может считаться преждевременной оптимизацией.

У этого есть недостаток или принятие некоторого времени и / или кода, чтобы придумать значение, которое очень редко дает значимое преимущество по времени и увеличивает умственную нагрузку.

Он также считается подсказкой и может использоваться или не использоваться, то есть деталь реализации, которую Apple может изменять на любом тине.

Примечание. Я провел тесты времени с подсказкой емкости и без нее и экономия времени, если таковая имеется, была крайне небольшим процентом.

Также см. ridiculousfish для получения дополнительной информации о NSArray.

Комментарий от @bbum: «состояние просто документов устанавливает начальную емкость не так, чтобы массив выделил память для хранения всей этой емкости. Хранилище памяти Array не является линейно распределенными кусками памяти, а детали меняются с размером массива. "

1
ответ дан zaph 26 August 2018 в 13:15
поделиться