読者です 読者をやめる 読者になる 読者になる

最近のコンパイラではvectorのiteratorはポインタで実装されていない?

追記:

                  • -

どうも誤解(こちらの誤読)だった様子。
恐らく多くの実装のiteratorは型としてはiteratorだが、実装上はポインタで成されているため、
最適化の恩恵を受けるとそれはポインタ演算をしていることと等価になる。
要するに、
++itは、アドレスをインクリメントすることと等価になる。
*itはアドレスの中身を参照することと等価になる。
よって、配列に比べて遅い理由がないということです。

                  • -

id:faith_and_brave さんより

vectoriteratorは、古いコンパイラなんかはポインタだったみたいですが
最近のコンパイラはそうじゃないと思います

これは大変興味深いので調査、
と思ったら最近のコンパイラとかないよ。><

とりあえず、
Visual Studio 2005で調査。(全然最近じゃないっすな

_Vector_const_iterator
には、
_Tptr _MyPtr; // offset of element in vector
とあり、基本ポインタ実装になる。

通常のiteratorは、
_Vector_iterator
だが、これは_Vector_const_iteratorを継承しており、
ポインタ実装であることが解る。
beginやendも以下のような感じで制御されている。
pointer _Myfirst; // pointer to beginning of array
pointer _Mylast; // pointer to current end of sequence
pointer _Myend; // pointer to end of array

beginなら、
return (iterator(_Myfirst)));
としてiteratorを作る。

……とすると、Visual Studio 2008から変わったのかな?
(持ってないので、誰か詳細きぼんぬです

gcc version 4.0.1 (Apple Inc. build 5488)
は、普通にSGISTL実装を使っているので、

__gnu_cxx::__normal_iterator
なので

typedef __gnu_cxx::__normal_iterator iterator;

であり、
__normal_iteratorは、
_Iterator _M_current;
を持つので、これもポインタ実装。

CodeWarriorも、
(組込環境なので詳しくは書かないが)
ポインタを用いている。


VS 2005も、gccも、CodeWarriorも確かに古いコンパイラだから、
ポインタを用いているんだろうけれど、
では、最新のコンパイラ、例えばVS2008? とかはどうやっているんだろう。


STLvectoriteratorがポインタ実装を用いない、
というは大事件なのだけれど、
こういうメジャな実装があるよ、というのがあれば教えてください。
(debug_iteratorではなく)