Использование STL Allocator с векторами STL - PullRequest
3 голосов
/ 22 января 2010

Вот основная проблема. Есть API, от которого я зависит, с методом, использующим следующий синтаксис:

void foo_api (std::vector<type>& ref_to_my_populated_vector);

Область кода, о которой идет речь, довольно интенсивно работает, и я хочу избежать использования кучи для выделения памяти. В результате я создал собственный распределитель, который выделяет память, необходимую для вектора в стеке. Итак, теперь я могу определить вектор как:

// Create the stack allocator, with room for 100 elements
my_stack_allocator<type, 100> my_allocator;

// Create the vector, specifying our stack allocator to use
std::vector<type, my_stack_allocator> my_vec(my_allocator);

Это все хорошо. Тесты производительности с использованием выделенного вектора стека по сравнению со стандартным вектором показывают производительность примерно в 4 раза быстрее. Проблема в том, что я не могу вызвать foo_api! Итак ...

foo_api(my_vec); // Results in an error due to incompatible types.
// Can't convert std::vector<type> to std::vector<type, allocator>

Есть ли решение для этого?

1 Ответ

3 голосов
/ 22 января 2010

Вы должны использовать распределитель по умолчанию так, как ожидает функция. У вас есть два разных типа, и нет никакого способа обойти это.

Просто вызовите reserve перед тем, как работать с вектором, чтобы освободить память.

Подумайте о плохих вещах, которые могут случиться. Эта функция может взять ваш вектор и начать добавлять больше элементов. Вскоре вы можете переполнить выделенное пространство стека; ой!

Если вы действительно обеспокоены производительностью, гораздо лучше заменить operator new и kin на собственный менеджер памяти. Я сделал это, и распределение может быть значительно улучшено. Для меня выделение размеров размером 512 или меньше - это около 4 операций (переместите пару указателей вокруг); Я использовал распределитель пула)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...