контейнер со стеком и динамическим размещением - PullRequest
0 голосов
/ 10 декабря 2010

Существует ли контейнер, который использует локальный буфер для небольшого количества элементов и использует распределение кучи только тогда, когда количество элементов превышает определенный предел?Подобно тому, что делает большинство std::string реализаций.


Фон

Контейнер используется в следующем (упрощенном) контексте:

Foo foo;                     // some data
vector<HandlerPtr> tagged;   // receives "tagged" items

// first pass: over all items in someList
for each(HandlerPtr h in someList)
{
  h->HandleFoo(foo);         // foo may become tagged or untagged here
  if (foo.Tagged())
    tagged.push_back(h);
}
for(auto itr=tagged.rbegin(); itr!=tagged.end(); ++itr)
{
  // ...
}

Эта часть кода имеет высокую частоту вызовов, но пометить элемент довольно редко, число элементов в someContainer обычно мало, но не связано.Я не могу легко использовать предварительно выделенный «более глобальный» буфер.Цель состоит в том, чтобы избежать частого распределения.


Частота вызовов

  • Общее: ни один элемент не помечается.std :: vector нормально
  • Общее: помечается только один из нескольких элементов.вызывает высокочастотное распределение, которое я хочу избежать
  • Очень редко, но должно поддерживаться: someList увеличивается при первом проходе, количество элементов не предсказуемо, но все еще низко

Ответы [ 2 ]

3 голосов
/ 10 декабря 2010

Нет стандартного контейнера, который гарантирует такое поведение.Однако, если вы готовы, вы можете создать пользовательский класс распределителя, совместимый с STL, который будет извлекать из небольшого стекового буфера для небольших выделений и выполнять выделение кучи только тогда, когда запрошенный размер выделения превышает размер стекового буфера.Вы можете подключить свой собственный класс распределителя как второй параметр шаблона для std::vector<T, Alloc>.

Информацию о создании пользовательского распределителя следует прочитать в этой статье .

0 голосов
/ 10 декабря 2010

Хотя это не гарантируется, большинство std::string будет реализовывать Small String Optimization, то есть именно так (с VC ++ таким образом сохраняется от 10 до 8 или 16 символов)

Я не виделvectors делали это, и всегда задавались вопросом, почему, но будущий стандарт C ++ облегчит это с std::aligned_storage и alignof.Таким образом, мы сможем правильно выровнять необработанную память и построить контейнеры с некоторым количеством по умолчанию «стековой» памяти.

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