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.
(訳あってるよね?) |
なるほど、この補正によって現在のstd::vectorにメモリの連続性はあると解釈できる。
もはやメモリの確保にmallocやnew[]をつかう必要はない。いまさらvectorのことについて書くのもなんだが、通常のnew&ポインタを使ったメモリ操作と比べたvectorの利点を述べるなら
・メモリリークの回避
・動的確保と追加、削除の容易さ
・要素のアクセスにイテレータやポインタ、配列としてアクセスできる。
って感じかな。画像やサウンド、暗号化、圧縮等のバイナリ関係の処理はほぼすべてvectorに置き換えられるだろう。
ただ、この文章が発行されたのが1998年なので古いコンパイラだと微妙に実装が怪しいかもしれない。
参考
テンポラリ・バッファとしての std::vector の利用
http://www.s34.co.jp/cpptechdoc/article/vectorastemp/index.html