【发布时间】:2011-05-23 07:59:28
【问题描述】:
是否有容器对少量元素使用本地缓冲区,仅在元素数量超过一定限制时才使用堆分配?类似于大多数 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 在第一次通过时增长,项目数量不可预测但仍然很低
【问题讨论】:
-
您想使用静态分配还是堆栈分配?堆栈分配见stackoverflow.com/questions/354442/…
-
@nimrodn:堆栈分配可能是对我想要的更好的描述(固定标题)。即可以存储在容器实例中的元素数量有限(无需额外分配),如果这还不够,则使用堆分配。
-
std::vector在插入至少一个元素之前不会分配任何内存。
标签: c++ optimization stl containers