В каких ситуациях ATL CSimpleArray является лучшим выбором, чем CAtlArray? - PullRequest
1 голос
/ 18 ноября 2008

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

1 Ответ

1 голос
/ 13 марта 2009

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

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

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

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

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

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

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

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

...