13

有没有办法使用属性((aligned))来强制 STL 容器对齐到特定字节?目标编译器不是 Microsoft Visual C++。

哪些库(如果有)提供具有特定显式矢量化的 STL 算法的专门模板,例如 SSE。我感兴趣的编译器是 g++、Intel 和 IBM XL。

4

5 回答 5

14

使用 STL 容器,您可以通过可选的模板参数提供自己的分配器。我不建议从头开始编写整个分配器,但您可以编写一个只是一个包装器newdelete确保返回的内存满足您的对齐要求的分配器。(例如,如果您需要n16 字节对齐的字节,您可以使用它new来分配n + 15字节并返回指向该块中第一个 16 字节对齐地址的指针。)

但只需将对齐属性添加到元素类型就足够了。这超出了标准的范围,因此您必须检查编译器文档并尝试一下。

于 2010-01-08T23:41:55.733 回答
7

您需要传递一个自定义分配器。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();
     }
};

这里唯一缺少的是aligned_malloc,aligned_reallocaligned_free。您要么需要自己实现它们(不应该那么难),要么在互联网上找到它们的版本(我在OGRE引擎中至少看到过一个)。

于 2010-01-09T07:08:08.157 回答
3

您已经得到了一些好的答案,但似乎值得添加 C++ 0x 包含一个std::align(),这应该会使实现这样的事情更容易一些。

于 2010-01-10T22:47:20.993 回答
2

您需要一个返回对齐存储的自定义分配器。那应该可以解决你的问题。

于 2010-01-08T23:42:14.063 回答
0

如前所述您可以使用boost::alignment::aligned_allocator.

于 2017-08-25T04:33:12.843 回答