| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > allocator для stl & boost |
| Автор: xbarmaglot 25.3.2016, 17:24 |
| Возникла проблема при обработке больших потоков данных. Данные представляют из себя пакеты из сети разного размера. Профайлер показал, что большое время уходит на выделение памяти и вызов деструкторов стандартных контейнеров. Хотелось бы выделить большой кусок памяти и не вызывать оператор new при создании объекта, а просто резервировать память. При удалении объекта хотелось бы тоже не удалять ее, а просто помечать, что она свободна. Лишь только при нехватке перераспределить новую память. Существует ли такой глобальный аллокатор для всей библиотеки stl/ищщые? |
| Автор: xvr 25.3.2016, 18:31 | ||
| В стандартной stl нет (IMHO). Но никто не мешает написать свой и подсовывать его stl'ным контейнерам Как то так -
malloc/free заменяете на что надо (по вкусу) |
| Автор: baldman88 25.3.2016, 19:11 |
| Возможно я неправ, но кажется немного странным то, что при работе с сетью на первое место выходит время на создание и уничтожение контейнеров. Может проблема именно в том, что не совсем правильно организована обработка полученных данных? |
| Автор: xbarmaglot 28.3.2016, 12:51 |
| Ну мне приходят пакеты, я их разбираю и далее передаю сам пакет и методанные на обработку и запись. Поэтому сам пакет приходится хранить (т.е. копировать) и удалять по необходимости. |
| Автор: xbarmaglot 28.3.2016, 16:04 |
| порылся в интернете - есть готовые быстрые аллокаторы. Например, boost::fast_pool_allocator, TLFS, ... А можно ли его установить для stl/boost по-умолчанию, или нужно указывать при создании каждого контейнера? |
| Автор: xvr 28.3.2016, 17:07 |
Нет, но можно сделать свой namespace в котором переопределить (можно просто унаследовать) все stl/boost контейнеры (которые нужны) со своим алокатором |
| Автор: xbarmaglot 29.3.2016, 16:27 |
| не совсем так. Мне приходит большой UDP, который фрагментируется на пакеты. Само чтение из сокета - это копирование в локальный буфер. Фрагментация - это второе копирование уже чистого пакета в контейнер. А далее я уже гоняю умные указатели. Но когда пакет не нужен - удаление его. Получается, что как минимум один конструктор и один деструктор. Вот они и тупят, как показал профайлер |
| Автор: xbarmaglot 20.5.2016, 14:45 | ||
А можно ли как в пространстве std переопределить сам std::allocator? |
| Автор: xvr 20.5.2016, 15:44 | ||
Переопределить можно, но компилятор будет ругаться на дубликат определения Но можно сделать частичную специализацию allocator для ваших типов (если этого вам хватит) |
| Автор: xbarmaglot 23.5.2016, 10:37 | ||
У меня достаточно много типов. Сложновато для всех аллокатор свой делать... Может еще какие варианты есть ? |
| Автор: Alexeis 23.5.2016, 11:27 | ||
Кому сложновато? xvr уже определил вам шаблонные классы для основных контейнеров. Нужно просто пройти рефракторингом по коду и переименовать названия контейнеров. Определять нужно не для каждой переменной, а 1 раз для каждого вида контейнера. В STL едва ли десяток контейнеров наберется и сомневаюсь что у вас используются все. |