【发布时间】:2015-12-15 17:25:59
【问题描述】:
只是简单的介绍,用简单的话。
在 C++ 中,迭代器是“事物”,您至少可以在其上编写解引用运算符 *it、增量运算符 ++it,对于更高级的双向迭代器,减量 --it,最后但并非最不重要的是,随机访问迭代器,我们需要运算符索引it[] 以及可能的加法和减法。
C++ 中的此类“事物”是具有相应运算符重载的类型的对象,或简单明了的指针。
std::vector<> 是一个包装连续数组的容器类,因此指针作为迭代器是有意义的。在网上和一些文献中,您可以找到用作指针的vector.begin()。
使用指针的基本原理是开销更少,性能更高,特别是如果优化编译器检测到迭代并执行它的事情(向量指令和其他东西)。对于编译器来说,使用迭代器可能更难优化。
知道了这一点,我的问题是,为什么现代 STL 实现,比如说 MSVC++ 2013 或 Mingw 4.7 中的 libstdc++,使用向量迭代器的特殊类?
【问题讨论】:
-
问题是:为什么不呢?与您的想法相反,使用类而不是指针并不意味着增加开销,使用类还有其他潜在的好处。
-
一个原因是安全:库有关于取消引用无效迭代器的断言。
-
事实证明编译器足够聪明,可以找出向量迭代器类只包含一个指针,并据此进行优化。
-
@stgatilov 我认为这是过时的知识。是的,标准库需要积极的内联功能。但是现代编译器提供了这个,然后是一些。自 2007 年以来,编译器已经发展了很多。
-
一般来说,通用代码具有良好的内联和 comdat 折叠功能,更实用。一个优秀的现代编译器必须擅长该任务以利用现代 C++。没有它,C++ 就会瘫痪。但是,存在很好的现代编译器,它们实际上在这一点上比较普遍。他们继续变得更好。
标签: c++ vector iterator stdvector