私はSTLに関するいくつかのドキュメントを読んでいて、関数がコンテナの最後の要素の隣にend()
あるバイトのイテレータを返すことがそこに書かれていました。
そして、コンテナが利用可能なメモリ全体の最後のバイトを占有しているとしたらどうでしょうか。それではどうなりますか?
私はSTLに関するいくつかのドキュメントを読んでいて、関数がコンテナの最後の要素の隣にend()
あるバイトのイテレータを返すことがそこに書かれていました。
そして、コンテナが利用可能なメモリ全体の最後のバイトを占有しているとしたらどうでしょうか。それではどうなりますか?
C ++メモリモデルは、配列の最後の要素の後に要素へのポインタをいつでも形成できることを保証します。存在しない場合、システムはこの場所にオブジェクトを割り当てることを許可しないか、ラップアラウンドします。また、他のコンテナは他の適切な形式で終了位置を超えて処理するイテレータタイプを使用できるため、これは配列の潜在的な問題であることに注意してください。これらは、インクリメント操作の動作を完全に制御します。
エンドイテレータは(少なくとも比喩的に)コンテナの終わりを過ぎたところを指します。コンテナ内の有効なアイテムはからになり*container.begin()
ます*container.end()-1
。
つまり、他のイテレータを終了イテレータと比較して、それらが等しいかどうかを確認できます(これは、コンテナ内のアイテムの最後に到達したことを示します)が、その終了イテレータを逆参照することはできません(つまり、 、参照しているアイテムにアクセスしようとしないでください)。
編集:申し訳ありませんが、質問の一種を誤解しました:コンテナが実際にメモリの最後のバイトを使用した場合(まれ/可能性は低いですが、理論的には可能です)、通常、アドレスがメモリの先頭にラップアラウンドしているのがわかります。もちろん、アドレスに関して実際に機能したイテレータ。このような場合、通常はアドレスに変換され0
ますが、それでも有効なアドレスと区別できます(つまり、0
有効なポインターにはなり得ないnullポインターに変換されます)。
ただし、一般的なケースでは、そのようなことが許可されない可能性があります。たとえば、ほとんどの32ビットシステムでは、ユーザーは最初の2ギガバイトまたは3ギガバイトのアドレス空間の使用に制限されており、上位アドレスはオペレーティングシステム用に予約されています。