std::vectorにメモリの連続性はあるか?



STLコンテナのVectorにメモリの連続性はない。標準C++の規格のどこにも連続性については書かれていないからだ。つまり画像やサウンド用のメモリ確保の為にVectorは使えないということだ。
が、実際使ってみるとちゃんと画像も正確に表示されているし、コンパイラの実装としてもvectorの要素は連続領域に配置されているようだ。使えるじゃん。

このことについて調べてみると、C++ Standard Library Defect Report List(後にC++標準化委員会が発行したフォロー)の69項にて


he issue is this: Must the elements of a vector be in contiguous memory?
問題はこれです:ベクトルの要素は隣接メモリにあるに違いありませんか?

Proposed resolution:
提案された解決:

Add the following text to the end of 23.2.4 [lib.vector], paragraph 1.
23.2.4[lib.vector] 段落1 の最後へ次のテキストを加えてください。

The elements of a vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().
ベクトルの要素は隣接して格納される。
 v が<T, Allocator>でT がbool以外のの場合 、 0 <=n<v.size() の時 &v[n] == &v[0] + n となることを意味する

(訳あってるよね?)

なるほど、この補正によって現在のstd::vectorにメモリの連続性はあると解釈できる。

もはやメモリの確保にmallocやnew[]をつかう必要はない。いまさらvectorのことについて書くのもなんだが、通常のnew&ポインタを使ったメモリ操作と比べたvectorの利点を述べるなら

 ・メモリリークの回避
 ・動的確保と追加、削除の容易さ
 ・要素のアクセスにイテレータやポインタ、配列としてアクセスできる。

って感じかな。画像やサウンド、暗号化、圧縮等のバイナリ関係の処理はほぼすべてvectorに置き換えられるだろう。

ただ、この文章が発行されたのが1998年なので古いコンパイラだと微妙に実装が怪しいかもしれない。



参考
テンポラリ・バッファとしての std::vector の利用
http://www.s34.co.jp/cpptechdoc/article/vectorastemp/index.html