std::vector<T, カスタムallocator>

  • 1
    いいね
  • 0
    コメント

C++Builder(Win64)を使ってstd::vector<T>のカスタムallocatorを作る。

昨日、ebisu_optimized.cpp vol.2でして
終了後の食事で話ししてたので、C++Builderでも試してみました。

template<class _Ty, class _Alloc = allocator<_Ty> >
class vector: public _Vector_alloc<_Vec_base_types<_Ty, _Alloc> >{.....}

こうなので。。。
allocator<_Ty>はカスタムを作って入れる事ができます。

std::allocator<T>を使ってカスタムクラスを作成します。

Unit1.cpp
#include <functional>
template <typename T> struct _Allocator: public std::allocator<T>
{
    std::function<void(String)> _evt{[&](String _s){
            Form1->Memo1->Lines->Append(_s);
        }};
    _Allocator() { }
    _Allocator(const _Allocator& x) { }

    template<class T1>_Allocator(const _Allocator<T1>& x) { }

    T* allocate(size_t n, const T hint = 0) {
        if ( _evt != nullptr)
            _evt("allocate byte size=" + FloatToStr(n * sizeof(T)));
        return (T*) std::malloc(n * sizeof(T));
    }

    void deallocate(T* ptr, size_t n) {
        if ( _evt != nullptr) _evt("free");
        std::free(ptr);
    }
    template<class T1>struct rebind { typedef _Allocator<T1> other; };
};

実行

Unit1.cpp

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Memo1->Lines->Clear();
    Memo1->Lines->Append("------ byte ------");
    std::vector<byte, _Allocator<byte>> vbyte{1};
    Memo1->Lines->Append("");
    Memo1->Lines->Append("------ long long ------");
    std::vector<long long, _Allocator<long long>> vlonglong{1};
    Memo1->Lines->Append("");
    Memo1->Lines->Append("------ UnicodeString ------");
    std::vector<UnicodeString, _Allocator<UnicodeString>> vUnicodeString{""};
    Memo1->Lines->Append("");
}
//---------------------------------------------------------------------------

2017-04-141303.png

参考URL

https://community.embarcadero.com/blogs/entry/std-allocator-custom-allocator-japan