如果以通常实现的方式实现数组类,则其性能与其像STL等效的向量相比较慢。那么是什么让STL容器/算法变得快速?
答案 0 :(得分:10)
像for_each
这样的STL算法采用可以轻松内联的函数对象。另一方面,C使用函数指针,这对于编译器来说更难以优化。
这在一些算法中有很大的不同,比如必须多次调用比较器函数的排序。
如果您感兴趣,维基百科有some more information。
修改强>
至于STL的矢量类,我不认为你可以在glibc中找到它的速度。
答案 1 :(得分:5)
大多数人的数组类通过常量增量而不是常数因子(如标准库所需)增加大小。这意味着插入元素需要大致线性时间,而不是标准库的摊销常量时间。
答案 2 :(得分:1)
标准库使用了很好的算法,比如在数组(std :: vector)的情况下,每次空间不足时它通常会使存储空间增加一倍,而天真的实现可能每次都会增加一个元素的存储空间。因为增加存储量非常慢(所有现有数据都需要从旧分配复制到新分配),这可能会产生巨大的差异。
同样,所有其他算法都以相当优化的方式实现。标准库通常不在源代码级别上使用任何类型的循环展开或其他此类优化。它只是常规的简单代码(带有可怕的变量名和很多模板),编译器随后会对其进行优化。
我所说的并不是C ++标准所规定的,而是现有实现中常见的做法。
答案 3 :(得分:1)
STL中的算法已经被各级数学家和计算机科学家研究了多年,他们通常使用绝对最有效的算法,您的实现可能没有使用。常见的实现可能不是最快的,但最容易理解; STL可能正在使用更优化的实现。
答案 4 :(得分:0)
代码以编译器友好的方式编写,例如:内联等。
当然,他们使用的算法是最先进的。
答案 5 :(得分:0)
除了良好的通用算法(正如其他人已经注意到的),STL也非常有效,因为大量使用模板。
Template metaprograms具有很好的功能,编译器会积极地优化它们。有些编译器非常擅长这一点,并将模板减少为给定任务的最小,最有效,最需要的代码。通常,这意味着只要有可能就会内联函数,并且与特定类型交互的代码将简化为最简单的形式。当然,大多数STL(以及大多数Boost)的实现都充分利用了这一点。