おそらく属性((aligned))を使用して、STL コンテナーの配置を特定のバイトに強制する方法はありますか? ターゲット コンパイラは Microsoft Visual C++ ではありません。
特定の明示的なベクトル化 (SSE など) を持つ STL アルゴリズムの特殊なテンプレートを提供するライブラリ (ある場合)。私が興味を持っているコンパイラは、g++、Intel、および IBM XL です。
おそらく属性((aligned))を使用して、STL コンテナーの配置を特定のバイトに強制する方法はありますか? ターゲット コンパイラは Microsoft Visual C++ ではありません。
特定の明示的なベクトル化 (SSE など) を持つ STL アルゴリズムの特殊なテンプレートを提供するライブラリ (ある場合)。私が興味を持っているコンパイラは、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();
}
};
ここに欠けているのは、、、だけaligned_malloc
です。それらを自分で実装するか(それほど難しいことではないはずです)、インターネット上でそれらのバージョンを見つける必要があります(OGREエンジンで少なくとも1つ見ました)。aligned_realloc
aligned_free
すでにいくつかの良い答えが得られていますが、C ++ 0xにが含まれていることを追加する価値があるstd::align()
ようです。これにより、このような実装が少し簡単になります。
アラインされたストレージを返すカスタム アロケーターが必要です。それはあなたの問題を解決するはずです。