2017-01-20 2 views
3

Я обнаружил, что много раз мне нужен только небольшой std::map (скажем, менее 10 ключей) или небольшой std::vector, содержащий только несколько элементов, и я думаю, что это действительно пустая трата времени, чтобы всегда динамически выделять их, особенно в таких структурах, как std::map<std::string, std::string>, std::vector<std::string>, там действительно много динамического распределения.Как избежать динамического выделения небольших объектов?

Хороший совет? По крайней мере, уменьшите количество динамического распределения, лучше, не ухудшая простоту использования. Благодаря

+1

Вообще, если это узкое место в вашем коде один подход заключается в написании или использовать [пул памяти] (HTTPS : //stackoverflow.com/questions/16378306/c11-memory-pool-design-pattern). По сути, вы предварительно выделяете кучу памяти, а затем просто переделываете ее снова и снова, не перераспределяя ее. – CoryKramer

+0

Если вы работаете с критическим поломкой, вы всегда можете выделить место во время инициализации. Если вам нужна какая-то реальная производительность или есть узкое место, вам придется написать специализированный распределитель памяти. – P0W

+2

Вы действительно измерили затраты на такие распределения? Просто «мышление» фрагмента кода как узкое место - это руководство для изменения кода. Итак, сначала выполните некоторые меры, чтобы подтвердить, что это усилие. – rpy

ответ

4

Вы можете использовать стек -allocated памяти для небольших данных размера (как распределение стека очень быстро, в основном только движение стека указателя, хотя пространство стека драгоценно, и это очень ограниченный ресурс), и куча -распределенная память для больше размер. Другими словами, подумайте по строкам std::stringоптимизация небольших строк.

Кроме того, чтобы ускорить выделение, вы также можете выделить большие куски памяти в куче, а затем вырезать меньшие выделения внутри этих кусков, опять же в основном просто увеличивая указатель внутри куска. Для примерной реализации этого пула-распределителя рассмотрим возможность использования this blog post.

Вы найдете этот CppCon 2016 года говорить интересно, как хорошо:

High Performance Code 201: Hybrid Data Structures

Смежные вопросы