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()
会将内部缓冲区加倍以指数方式增长,因此您正在阻止指数增长并在每次迭代时强制重新分配/复制。在 ltrace
或 valgrind
下运行测试并查看 malloc()
调用的次数。
关于c++ - std::vector::reserve 性能损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1742859/