Существует ли способ осуществить выравнивание контейнера STL к определенному байту, с помощью атрибута ((выровненного)), возможно? целевые компиляторы не являются Microsoft Visual C++.
Что библиотеки, если таковые имеются, обеспечивают специализированным шаблонам алгоритмов STL, которые имеют определенную явную векторизацию, например, SSE. Мои компиляторы интереса являются g ++, Intel и IBM XL.
] С контейнерами STL вы можете предоставить свой собственный аллокатор через дополнительный параметр шаблона. Я бы не рекомендовал писать весь аллокатор с нуля, но вы можете написать такой, который будет просто обернут вокруг []new[
] и []delete[
], но при этом будет гарантировать, что возвращаемая память удовлетворяет вашим требованиям по выравниванию. (Например, если вам нужны []n[
] байты с 16-байтным выравниванием, вы используете []new[
], чтобы выделить []n + 15[
] байтов и вернуть указатель на первый 16-байтный выровненный адрес в этом блоке)[
]Но этого может быть достаточно, чтобы добавить атрибут выравнивания к типу элемента. Это выходит за рамки стандарта, так что вам придется проверить документацию компилятора и попробовать.[
]] Нужно передать пользовательский аллокатор. Его можно довольно легко построить по []std::allocator[
]:[
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();
}
};
]
[]Единственное, чего здесь не хватает, это []align_malloc[
], []align_realloc[
] и []align_free[
]. Их нужно либо реализовать самостоятельно (не должно быть так уж сложно), либо найти их версии в интернете (Я видел по крайней мере один в двигателе []OGRE[]).[
] Вам нужен пользовательский аллокатор, возвращающий выровненное хранилище. Это должно решить вашу проблему. [
] Вы уже получили несколько хороших ответов, но похоже, что он стоит добавить, что C ++ 0X включает в себя STD :: Alow ()
, что должно сделать реализацию таких вещей немного проще.