Это небольшие и автономные объекты - поместите их непосредственно в очередь вместо указателей.
- На самом деле в 64-битной системе предполагается, что
int
равно 32-бит (который есть, например, в Visual C ++), указатель будет таким же большим, как и сам объект!Таким образом, даже если у вас есть массовый распределитель, вы все равно платите эту цену. - Общий распределитель памяти будет не только дорогостоящим по времени, но и накладными расходами для каждого объекта, что в этом случае приведет к затуханиюсам объект (не относится к групповому распределителю).
Хотя вы могли бы разработать довольно эффективную схему «массового» распределения, я думаю, что проще обойти проблему и вообщеизбегайте выделения отдельных объектов.
--- EDIT ---
Вы можете помещать элементы в std::queue
следующим образом:
struct grid_cell {
grid_cell(int x0, int y0) {
x=x0;
y=y0;
}
int x;
int y;
};
// ...
std::queue<grid_cell> q;
q.push(grid_cell(0, 0));
q.push(grid_cell(0, 1));
q.push(grid_cell(0, 2));
q.push(grid_cell(1, 0));
q.push(grid_cell(1, 1));
q.push(grid_cell(1, 2));
Для std::priority_queue
вам нужно решить, как вы хотите заказать элементов.
--- EDIT 2 ---
@ Ричард Ваш код совершенно другой.
- Для каждого
push
ваш код выделит новый блок динамической памяти, создаст в нем объект (т.е. назначит x
иy
) и затем нажмите указатель на этот блок памяти в очереди. - Моя трескаe создает объект непосредственно в своем «слоте» внутри большего блока памяти, который был предварительно выделен самим
queue
.И, как вы уже заметили, несколько больших выделений лучше, чем множество маленьких.
Ваш код:
- подвержен утечкам памяти
- вы платитедля дополнительного хранения указателей,
- , склонных к фрагментации памяти, и
- , как я уже упоминал, есть накладные расходы для каждого объекта.
Специализированный распределитель можетудалить последние две проблемы, но почему бы не удалить их все?
--- EDIT 3 ---
Что касается скорости, общее динамическое распределение памяти составляет дорогой (около 40-50 машинных инструкций для лучших распределителей).
Специализированный распределитель блоков будет намного быстрее, но у вас все еще есть проблема с задержкой памяти: гарантированно будет достигнуто правильное хранение всего вместелучшая локальность кэша и гораздо более подходящая для логики предварительной выборки ЦП, чем многократный «прыжок» между очередью и фактическими объектами путем разыменования указателей.