その2

前回の続き。
newを必要最低限しか行わない→newした領域は無駄なく全て使用します。
popしようがclearしようが、領域はdeleteされません。

概要

領域の使用開始位置(offset)と使用サイズ(size)を記憶しておき、
pop_backされたらsize-1、pop_frontされたらsize-1、offset+1とします。
offsetの隙間も使用されますが、当然アドレスは連続しません。
そこでindexを付与します。


    struct element
    {
        int index;
        T   object;
        element() {
            nIndex = -1;    // 使用されてないシルシ
        }
    };

indexが仮想メモリアドレスとなります。
operator[]などの要素アクセスで物理メモリアドレスに変換するわけですが、
下手をすると領域全てを走査する羽目になりかねません。
そこで仮想メモリアドレスと物理メモリアドレスが一致するように配置していきます。
(できなかった分は最初から走査していく他ないんですが^^;)


push_backで領域がいっぱいになったときはresizeで領域を拡張し、ついでに仮想メモリアドレスを物理アドレスと一致するよう並べ直します。

ソースコード