如果按照常规方式实现一个数组类,其性能与STL等效的向量相比要慢。那么是什么让STL容器/算法更快呢?
STL算法比如for_each
采用函数对象,这些函数对象可以很容易地内联。相反,C语言使用函数指针,这对编译器的优化来说要困难得多。
这在某些算法中会产生很大的差异,例如排序算法中,比较函数必须被调用多次。
如果您感兴趣,维基百科在这里提供了更多信息。
编辑:
至于STL的vector类,我认为它不一定比你在glibc中找到的更快。
大多数人的数组类增加大小是通过常量增量而不是常量因子(标准库所需)来实现的。这意味着插入一个元素需要大约线性时间,而不是标准库的摊销常量时间。
标准库使用了优秀的算法,例如在数组(std::vector)的情况下,它通常会在空间不足时将存储空间翻倍,而天真的实现可能每次只增加一个元素的存储空间。由于增加存储空间非常缓慢(所有现有数据都需要从旧分配复制到新分配),这可能会产生巨大的差异。
同样,所有其他算法都以相当优化的方式实现。标准库通常不在源代码级别上使用任何循环展开或其他此类优化。它只是普通的好的和简单的代码(带有可怕的变量名和大量的模板),然后编译器进行优化。
我所说的并没有被C++标准规定,但这是现有实现中的通行做法。
除了好的通用算法(正如其他人所指出的),STL由于大量使用模板而非常高效。
模板元编程具有一个很好的特性,即编译器会积极地对它们进行优化。一些编译器在这方面非常擅长,可以将模板缩小到最小、最有效、最需要的代码来完成给定的任务。一般来说,这意味着函数在可能的情况下被内联,并且与特定类型交互的代码被简化到其最简形式。当然,STL的大多数实现(以及大多数Boost库)都充分利用了这一点。
代码以编译器友好的方式编写,例如内联等。
当然,他们使用的算法是最先进的。
vector.push_back()
进行比较吗?那不是在插入,而是在追加。 - UncleBens