Pull to refresh
19
0
Евгений Неручек @reficul0

Разработка по ту сторону кроличьей норы

Send message

Что нужно учитывать, используя std::vector?

Основные плюсы и минусы происходят от линейного расположения элементов в памяти и ограничений, которые это расположение накладывает.

std::vector имеет:

  • [+] Доступ к произвольному элементу за O(1).

  • [-] Проблема: При превышении capacity - долгая вставка нового элемента (даже в конец), тербующая поэлементного копирования.

    Решение: С этим можно побороться, если зарезервировать заранее всю нужную память под все элементы, но мы редко знаем каким будет максимальное количество элементов. И памяти на все процессы так не напасёшься, даже учитывая оптимизацию современных ОС: когда ОС физически выделяет память только когда процесс начинает её использовать.

  • Хороший cache coherence:

    • [+] В общем случае это означает более быстрый обход контейнера vector по сравнению с контейнерами а-ля list (map, set, forward_list etc.).

    • [-] Проблема: В частности, нужно разбиратсья с cache sharing.
      Если vector параллельно обходят два потока и каждый из них модифицирует его содержимое, то вероятно кэши этих потоков будет смотеть на смежную область памяти vector-а. Тогда каждая из записей будет инвалидировать содержимое кеша ядра другого потока, тем самым приводя к регулярному refetch-у. В некоторых корнер кейсах замена vector на list может внезапно привести к улучшению перфоманса.

      Решение: Лечится такая проблема обычно увеличением размера элемента до размера кэшлайна. Либо же выдачей каждому потоку по N элементов, где (N * sizeof(ElementT)) == cacheline size.

Tags:
Total votes 4: ↑3 and ↓1+2
Comments6
Me when posting about article updates
Me when posting about article updates

Поскольку на Хабре нет механизма оповещения об обновлениях статьи, решил написать про это пост.

Если вам посчастливилось одними из первых увидеть мою последнюю статью Глубина кроличьей норы: бинарная граница и ABI C++, то возможно, вы захотите к ней вернуться, когда узнаете что я добавил в неё несколько важных уточнений, которые перечислены в секции UPD (среди минорных исправлений пунктуационных ошибок и т.п.):

15.10.23:

  1. Добавил разьяснение про то, почему при переходе бинарной границы не стоит рассчитывать на copy elision. Ссылка на уточнение тут.

17.10.23:

  1. Добавил новый пункт про POD-типы: 2.3. Суровая реальность.

  2. Обновил заключение: В одном чёрном-чёрном доме ...

18.10.23:

  1. Добавил в пункт 2.1. Не позволяйте исключениям переходить бинарную границу подробный анализ причин почему не стоит пропускать исключения через бинарную границу.

Благодарю вас за уделённое время!

Tags:
Total votes 3: ↑3 and ↓0+3
Comments0

Information

Rating
Does not participate
Location
München, Bayern, Германия
Registered
Activity

Specialization

Software Developer, Application Developer
C#
C++
Multiple thread
C++ Boost
Git
High-loaded systems
Rust