Как правило, навязчивые коллекции являются наиболее эффективными с точки зрения использования памяти. Если ваша цель - выжать каждый последний цикл процессора, это единственный путь.
Рассмотрим список общих указателей надстройки. При создании нового объекта происходит следующее:
- объект, выделенный из кучи и инициализированный
- конструктор общего указателя boost из необработанного указателя выделяет другой объект в куче для хранения счетчика ссылок объекта (именно поэтому улучшающий навязчивый указатель лучше, поскольку счетчик ссылок хранится в объекте, избегая этого выделения)
- list :: insert выделяет узел списка и копирует общий указатель
В приведенном выше описании выделено три выделения памяти для создания и вставки нового объекта в коллекцию.
Теперь рассмотрите возможность использования навязчивого списка. Для той же задачи, что происходит:
- новый объект выделяется и инициализируется
- list :: insert просто назначает указатели узла списка объекта, так как узел встроен в объект и уже выделен
Здесь происходит только одно выделение памяти. Поскольку процессор использует меньше памяти при использовании навязчивых коллекций, кэши центрального процессора используются лучше, что приводит к меньшему количеству пропусков кэш-памяти и сокращению объема используемой памяти (известного как принцип ссылочной локальности).
Недостаток навязчивых коллекций заключается в том, что необходимо заранее знать, в каком типе и в каком количестве может быть объект за один раз. По моему личному опыту это дополнительное предварительное мышление приводит к более чистым и простым конструкциям.