vector/list のメモリ効率
- ref:http://www.algo.ics.tut.ac.jp/~yusuke_abe/html/2008-03-09.html#2008-03-09-1
- ref:http://d.hatena.ne.jp/Isoparametric/20080310/1205154971
- ref:http://d.hatena.ne.jp/bleis-tift/20080311/1205201438
意外なところに食いつきが良くてびびった。
vector は(基本的に) capacity が減らないってのはあるんだろうけど、私が考えていたのはそこではない。Java のコンテナは参照を保持しているだけだけど、C++ は直接値を保持しているというところ。
例えば、SGI の STL 実装では vector は capacity 以上の要素を加えようとすると capacity を倍に拡大するので、129個追加すると、sizeof(T) * 256 の領域が必要となる。
対して、list の場合は各要素ごとに前後のノードへのポインタが必要なので、リストのノードの型を ListNode として、必要な領域は大体 (sizeof(T) + sizeof(ListNode *) * 2) * 129 と。
で、例えば以下のような構造体を要素とすることを考えてみればよい。
struct FilePath { char path[256]; size_t len; };