这里,我们讨论标准模版库中的各种和性能相关的主题。 需要说明的是文中部分内容源自Efficient C++: Performance Programming Techniques.
1. 尽量使用指针作为容器元素
由于对象的拷贝构造函数和析构函数开销很大,而指针的复制和整数的复制几乎没有差别,所以应尽可能的使用指针作为容器元素。
什么情况下,不需要使用指针?
一种是容器元素是较小的基本数据类型,比如int类型。另外一些情况是环境所定,比如接口已经定义好,你无法更改,只能适应。
某些情况下你需要用到诸如 vector<vector<Type> >之类的容器嵌套,这里可以用 vector<Type>*, 这样的表达式看起来有点古怪,不过它工作的很好。
2. 对象的自然插入性能和插入对象大小对性能的影响。
这里的比较基于各种容器非特定的插入算法, 比如push_back. 对于有些插入样式,比如push_front,由于容器实现机理不同,有些容器天生的就具有优势,而设计者也考虑到这点,所以不会愚蠢的为vector实现push_front。
下面是一个插入100万个整数性能测试数据,你可以参考:
数组(70ms)< vector(250ms /push_back) < list(930ms /push_back) <multiset(6500ms /insert)
vector使用reserve的情况下性能提升2-3倍
真正的问题是: 在容器元素为大对象时