c++ - std::vector::reserve 性能损失

标签 c++ performance stl stdvector

inline void add(const DataStruct& rhs) {
   using namespace boost::assign;
   vec.reserve(vec.size() + 3);
   vec += rhs.a, rhs.b, rhs.c;
}

上面的函数被执行了大约 17000 次,并且它执行了(据我所知。涉及到一些转换)大约 2 个数量级差 对 vector::reserve 的调用。

我一直觉得 reserve 可以加快 push_back 即使对于小值,但这似乎不是真的,我找不到任何明显的理由说明它不应该这样。 reserve 是否会阻止函数的内联?对 size() 的调用是否太昂贵?这取决于平台吗?我将尝试编写一些小型基准以在干净的环境中确认这一点。

编译器:gcc (GCC) 4.4.2 with -g -O2

最佳答案

reserve() 的 GCC 实现将分配精确数量的元素,而 push_back() 会将内部缓冲区加倍以指数方式增长,因此您正在阻止指数增长并在每次迭代时强制重新分配/复制。在 ltracevalgrind 下运行测试并查看 malloc() 调用的次数。

关于c++ - std::vector::reserve 性能损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1742859/

相关文章:

c++ - 如何让所有平台编译器为 NaN 输出相同的字符串?

c++ - 带参数默认值的 QMetaMethod::invoke()

javascript - 使用 Spring Controller 的缓慢 GET 请求

php - 如何在不损失性能/良好设计的情况下构建完全可定制的应用程序(又名数据库)?

performance - Haproxy SNI 与 HTTP 主机 ACL 检查性能

STL - 如何在 Ada 中进行 std::rotate?

c++ - std::list 的循环迭代

c++ - 字符串 "figured"显示为 "?gured"

c++ - suspend-up 和 suspend-down 协程有什么区别?

c++ - std::map::insert 无限循环用于不正确的 value_type