C++ C++;STL数据结构对齐、算法矢量化

C++ C++;STL数据结构对齐、算法矢量化,c++,stl,alignment,vectorization,C++,Stl,Alignment,Vectorization,有没有一种方法可以使用属性((对齐))强制STL容器与特定字节对齐?目标编译器不是微软Visual C++。 哪些库(如有)提供具有特定显式矢量化的STL算法的专用模板,例如SSE。我感兴趣的编译器是g++、Intel和IBM XL。对于STL容器,您可以通过可选的模板参数提供自己的分配器。我不建议从头开始编写一个完整的分配器,但您可以编写一个仅是new和delete的包装器,但可以确保返回的内存满足对齐要求。(例如,如果需要具有16字节对齐方式的n字节,则使用new分配n+15字节,并返回指向

有没有一种方法可以使用属性((对齐))强制STL容器与特定字节对齐?目标编译器不是微软Visual C++。
哪些库(如有)提供具有特定显式矢量化的STL算法的专用模板,例如SSE。我感兴趣的编译器是g++、Intel和IBM XL。

对于STL容器,您可以通过可选的模板参数提供自己的分配器。我不建议从头开始编写一个完整的分配器,但您可以编写一个仅是
new
delete
的包装器,但可以确保返回的内存满足对齐要求。(例如,如果需要具有16字节对齐方式的
n
字节,则使用
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();
     }
};
模板
类对齐的分配程序:public std::allocator
{
公众:
对齐的_分配器(){}
对齐的分配程序和运算符=(常量对齐的分配程序和rhs){
std::分配器::运算符=(rhs);
归还*这个;
}
指针分配(大小\类型n,常量void*提示){
指针p=NULL;
尺寸t计数=尺寸f(t)*n;
大小\u t计数\u左=计数%t块;
如果(左计数!=0)
{
计数+=TBLOCK-左计数;
}
如果(!提示)
{
p=重新解释铸型(对齐的铸型(计数,TALIGN));
}否则{
p=重新解释(对齐的realloc((void*)提示、计数、TALIGN));
}
返回p;
}
无效解除分配(指针p,大小\类型n){
无尿(p);
}
无效构造(指针p、常量T和val){
新(p)T(val);
}
无效销毁(指针p){
p->~T();
}
};

这里唯一缺少的是
aligned\u malloc
aligned\u realloc
aligned\u free
。你要么自己需要实现它们(不应该那么难),要么在因特网上找到那些版本(我在引擎中看到过至少一个)。

你已经得到了一些好的答案,但是似乎值得添加的是C++ +0x包含一个<代码>:STD::这将使实现类似的事情变得更容易。

而不是编写自己的分配器,因为您可以使用。

有没有将其用作分配器的示例?@Anycorn,您实现过吗?在这里完成Kornel Kisielewicz的例子似乎很棒,因为我在网上其他任何地方都看不到这方面的好例子。