В каких ситуациях ATL CSimpleArray лучше, чем CAtlArray

В документации говорится, что CSimpleArray предназначен для работы с небольшим количеством объектов. Что в этом контексте мало? Является ли CSimpleArray хорошим выбором или я всегда должен использовать другой класс коллекции, например CAtlArray?

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
0
1 591
1

Ответы 1

«Маленький» здесь - это эмпирическое правило, основанное на том, как два класса управляют своей памятью изнутри. По сути, CAtlArray обеспечивает более детальный контроль над используемой памятью, а CSimpleArray работает с памятью просто, но наивно.

В частности, когда элемент добавляется в CSimpleArray, если массив уже использует всю выделенную им память, он удваивает свой размер, что является довольно дорогостоящей операцией. Вновь созданный CSimpleArray будет начинаться с места для 0 элементов. Допустим, вы хотите добавить в массив 5 элементов. Это будет выглядеть так:

  • Добавить 1-й элемент - места нет, поэтому перераспределите место для 1 элемента всего
  • Добавьте 2-й предмет - места нет, поэтому перераспределите место для 2 предметов всего
  • Добавьте 3-й предмет - места нет, поэтому перераспределите место для 4 предметов всего
  • Добавьте 4-й предмет - места есть, просто добавьте
  • Добавьте 5-й предмет - места нет, поэтому перераспределите место для 8 предметов всего
  • и так далее...

Также обратите внимание, что нет способа указать начальный размер CSimpleArray, поэтому этот шаблон будет всегда.

С другой стороны, CAtlArray позволяет вам сразу указать всю выделенную память с помощью метода SetCount (). Используя тот же пример, что и выше, перед добавлением элементов вызовите SetCount (5). Тогда всегда будет место для 5 предметов, и перераспределения делать не нужно.

Итак, чтобы ответить на вопрос: используйте CAtlArray, если вы заботитесь об управлении памятью, особенно если вас беспокоит производительность. Используйте CSimpleArray, если вы просто хотите сохранить несколько элементов в списке и не заботитесь о том, как управляется память, которую занимает список. Чтобы ответить на конкретный вопрос о том, что в данном контексте означает «маленький» и «большой», «маленький» означает достаточно мало элементов, которые вы можете перераспределять каждый раз, когда длина превышает следующую степень двойки.

Также стоит отметить, что CSimpleArray позволяет выполнять поиск в массиве с помощью метода Find (), а CAtlArray - нет.

(Примечание: мой ответ основан только на просмотре исходного кода ATL.)

Другие вопросы по теме