Sie müssen einen benutzerdefinierten Zuordner übergeben. Sie können ganz einfach einen über den std::allocator
bauen:
template <typename T, size_t TALIGN=16, size_t TBLOCK=8>
class aligned_allocator : public std::allocator<T>
{
public:
aligned_allocator() {}
aligned_allocator& operator=(const aligned_allocator &rhs){
std::allocator<T>::operator=(rhs);
return *this;
}
pointer allocate(size_type n, const void *hint){
pointer p = NULL;
size_t count = sizeof(T) * n;
size_t count_left = count % TBLOCK;
if(count_left != 0)
{
count += TBLOCK - count_left;
}
if (!hint)
{
p = reinterpret_cast<pointer>(aligned_malloc(count,TALIGN));
}else{
p = reinterpret_cast<pointer>(aligned_realloc((void*)hint,count,TALIGN));
}
return p;
}
void deallocate(pointer p, size_type n){
aligned_free(p);
}
void construct(pointer p, const T &val){
new(p) T(val);
}
void destroy(pointer p){
p->~T();
}
};
Das einzige, was hier fehlt, ist die aligned_malloc
, aligned_realloc
und aligned_free
. Sie müssen sie entweder selbst implementieren (sollte nicht so schwer sein), oder finden Sie Versionen von denen im Internet (Ich habe mindestens eine in OGRE Motor gesehen).
@Anycorn, hast du das jemals umgesetzt? Es scheint, als wäre es großartig, hier das Beispiel von Kornel Kisielewicz zu vervollständigen, weil ich nirgendwo sonst ein gutes Beispiel dafür sehe. –