FakeAllocator がフェイク過ぎて、毎回同じアドレスを
返すなんて使い物にならないだろうと気になっていたので、
もうちょっとましな実装に変えてみました。
コード:
#include <iostream>
#include <vector>
using namespace std;
struct FakeAllocator {
typedef int value_type;
template <class U> struct rebind { typedef FakeAllocator other; };
int* allocate(size_t n) {
ptr += n;
cout << "allocate: ptr = " << ptr << endl;
return ptr - n;
}
void deallocate(int* p, size_t n) {
if (p + n == ptr) ptr -= n;
cout << "deallocate: ptr = " << ptr << endl;
}
static void set(int *p) {
ptr = p;
cout << "set: ptr = " << ptr << endl;
}
static int* ptr;
};
int* FakeAllocator::ptr;
int main()
{
int buf[1024];
FakeAllocator::set(buf);
vector<int, FakeAllocator> a(3);
vector<int, FakeAllocator> b(5);
vector<int, FakeAllocator> c(4);
cout << " buf = " << buf << endl;
cout << "&a[0] = " << &a[0] << endl;
cout << "&b[0] = " << &b[0] << endl;
cout << "&c[0] = " << &c[0] << endl;
}
g++ による実行結果
コード:
set: ptr = 0xffffbbc0
allocate: ptr = 0xffffbbcc
allocate: ptr = 0xffffbbe0
allocate: ptr = 0xffffbbf0
buf = 0xffffbbc0
&a[0] = 0xffffbbc0
&b[0] = 0xffffbbcc
&c[0] = 0xffffbbe0
deallocate: ptr = 0xffffbbe0
deallocate: ptr = 0xffffbbcc
deallocate: ptr = 0xffffbbc0
用意された領域を使い切ったかどうかのチェックをしていないので
まだ不完全ですが、とにかく、デフォルトの allocator より
高速な処理になることは確かです。