gpt4 book ai didi

c++ - 具有堆栈和动态分配的容器

转载 作者:行者123 更新时间:2023-11-28 01:09:07 24 4
gpt4 key购买 nike

有没有一种容器对少量元素使用本地缓冲区,只有当元素数量超过一定限制时才使用堆分配?类似于大多数 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 中的项目数量通常很少但未绑定(bind)。我不能轻易使用预分配的“更全局”缓冲区。目标是避免频繁分配。


调用频率

  • 常见:没有项目被标记。 std::vector 没问题
  • 常见:少数项目中只有一个被标记。导致我想避免的高频分配
  • 非常罕见,但必须支持:someList 在第一次通过时增长,项目数量不可预测但仍然很低

最佳答案

没有标准容器可以保证这种行为。但是,如果您愿意,您可以创建一个自定义的 STL 兼容分配器类,该类从小堆栈缓冲区中提取用于小分配,并且仅在请求的分配大小超过堆栈缓冲区大小时才执行堆分配。您可以插入自定义分配器类作为 std::vector<T, Alloc> 的第二个模板参数。 .

有关创建自定义分配器的信息,您应该阅读 this article .

关于c++ - 具有堆栈和动态分配的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4406502/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com