13

おそらく属性((aligned))を使用して、STL コンテナーの配置を特定のバイトに強制する方法はありますか? ターゲット コンパイラは Microsoft Visual C++ ではありません。

特定の明示的なベクトル化 (SSE など) を持つ STL アルゴリズムの特殊なテンプレートを提供するライブラリ (ある場合)。私が興味を持っているコンパイラは、g++、Intel、および IBM XL です。

4

5 に答える 5

14

STL コンテナーを使用すると、オプションのテンプレート パラメーターを介して独自のアロケーターを提供できます。アロケーター全体を最初から作成することはお勧めしませんが、単なるラッパーでnewありdeleteながら、返されるメモリがアライメント要件を満たすことを保証するものを作成することはできます。n(たとえば、 16 バイト アラインメントのバイトが必要な場合は、 を使用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です。それらを自分で実装するか(それほど難しいことではないはずです)、インターネット上でそれらのバージョンを見つける必要があります(OGREエンジンで少なくとも1つ見ました)。aligned_reallocaligned_free

于 2010-01-09T07:08:08.157 に答える
3

すでにいくつかの良い答えが得られていますが、C ++ 0xにが含まれていることを追加する価値があるstd::align()ようです。これにより、このような実装が少し簡単になります。

于 2010-01-10T22:47:20.993 に答える
2

アラインされたストレージを返すカスタム アロケーターが必要です。それはあなたの問題を解決するはずです。

于 2010-01-08T23:42:14.063 に答える