2013年11月17日日曜日

カスタムアロケータで割り当てサイズ制限

"C++のカスタムアロケータを作ってみる"に続いて,寝る前にもうひとまとめ.

カスタムアロケータにmax_sizeを定義して,数値を返すようにすると,一度に割り当てられる要素の数をその数で制限できる.
ということで,適当に4個にして実験してみる.

#include <iostream>
#include <vector>

using namespace std;

template <typename T>
class log_allocator {
public:
    typedef T value_type;
    typedef T* pointer;
    typedef size_t size_type;

    pointer allocate(size_type n)
    {
        pointer p = new T[n];
        cout << "allocate " << p << " : " << n << endl;
        return p;
    }

    void deallocate(pointer p, size_type n)
    {
        cout << "deallocate " << p << " : " << n << endl;
        delete [] p;
    }

    size_type max_size() const noexcept
    {
        return 4;
    }
};

int main()
{
    vector<double, log_allocator<double>> iv;
    iv.push_back(1);
    iv.push_back(2);
    iv.push_back(3);
    iv.push_back(4);
    iv.push_back(5);
}

5個目を追加しようとした時点で,length_errorの例外が発生する.
あくまでも1度に割り当てられる要素数の最大値であって,全体として割り当てられる要素数の最大値ではない.
具体的には,allocate(N)を実行したときに,N <= max_size()なら割り当てに成功する,という意味だそうな.

ちなみに,このmax_sizeが定義されていない場合はnumeric_limits<size_type>::max()がmax_sizeとして使われる.
特定の関数が定義されていない場合に別の関数が呼び出されるようにするためのテンプレート周りのテクニックについては,どこかで解説されていた気がするけど,忘れた.

0 件のコメント:

コメントを投稿