首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有堆栈和动态分配的容器

具有堆栈和动态分配的容器
EN

Stack Overflow用户
提问于 2010-12-10 07:09:24
回答 2查看 1.4K关注 0票数 0

是否有一个容器对少量元素使用本地缓冲区,并且只有在元素数量超过一定限制时才使用堆分配?类似于大多数std::string实现所做的事情。

背景

容器在以下(简化)上下文中使用:

代码语言:javascript
运行
复制
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中的项数通常较低但未绑定。我不能轻易地使用预先分配的“更全局”缓冲区。目标是避免频繁的分配。

呼叫频率

  • 常见情况:没有任何项目会被标记。传播媒介是很好的
  • 共同之处:只有少数几个项目中的一个会被标记。导致我想避免的高频分配
  • 非常罕见,但必须得到支持: someList在第一次通过时增长,项目数量不可预测,但仍然很低。
EN

回答 2

Stack Overflow用户

发布于 2010-12-10 07:37:04

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

有关创建自定义分配器的信息,请阅读这篇文章

票数 3
EN

Stack Overflow用户

发布于 2010-12-10 08:35:33

虽然不能保证这一点,但大多数std::string都会实现Small String Optimization,这就是( VC++10最多存储8或16个字符)。

我还没见过vectors这么做,我总是想知道为什么,但是即将推出的C++标准将为std::aligned_storagealignof提供便利。通过这种方式,我们可以获得正确对齐的原始内存,并构建一些默认数量的“堆栈”内存的容器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4406502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档