C++ выравнивание структуры данных STL, векторизация алгоритма

Существует ли способ осуществить выравнивание контейнера STL к определенному байту, с помощью атрибута ((выровненного)), возможно? целевые компиляторы не являются Microsoft Visual C++.

Что библиотеки, если таковые имеются, обеспечивают специализированным шаблонам алгоритмов STL, которые имеют определенную явную векторизацию, например, SSE. Мои компиляторы интереса являются g ++, Intel и IBM XL.

13
задан Chris says Reinstate Monica 10 December 2011 в 12:37
поделиться

4 ответа

[

] С контейнерами STL вы можете предоставить свой собственный аллокатор через дополнительный параметр шаблона. Я бы не рекомендовал писать весь аллокатор с нуля, но вы можете написать такой, который будет просто обернут вокруг []new[] и []delete[], но при этом будет гарантировать, что возвращаемая память удовлетворяет вашим требованиям по выравниванию. (Например, если вам нужны []n[] байты с 16-байтным выравниванием, вы используете []new[], чтобы выделить []n + 15[] байтов и вернуть указатель на первый 16-байтный выровненный адрес в этом блоке)[

] [

]Но этого может быть достаточно, чтобы добавить атрибут выравнивания к типу элемента. Это выходит за рамки стандарта, так что вам придется проверить документацию компилятора и попробовать.[

]
13
ответ дан 1 December 2019 в 21:37
поделиться
[

] Нужно передать пользовательский аллокатор. Его можно довольно легко построить по []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[]).[

].
7
ответ дан 1 December 2019 в 21:37
поделиться
[

] Вам нужен пользовательский аллокатор, возвращающий выровненное хранилище. Это должно решить вашу проблему. [

]
2
ответ дан 1 December 2019 в 21:37
поделиться

Вы уже получили несколько хороших ответов, но похоже, что он стоит добавить, что C ++ 0X включает в себя STD :: Alow () , что должно сделать реализацию таких вещей немного проще.

3
ответ дан 1 December 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: