2011-12-16 2 views
2

私はGCCとキャッシュ整列ベクトルの値の型として__m128i使用しようとしている、と私は、次のエラーを取得しています:tbb :: cache_aligned_allocator:__m128iを使用して「非クラス型メンバーの要求を取得する」。ユーザーエラーまたはバグ?

/usr/include/tbb/cache_aligned_allocator.h:105:32: error: request for member ‘~tbb::cache_aligned_allocator<__vector(2) long long int>::value_type’ in ‘* p’, which is of non-class type ‘tbb::cache_aligned_allocator<__vector(2) long long int>::value_type {aka __vector(2) long long int}’

コンパイラはTBB/cache_aligned_allocatorに次の行にそれをトレース.H:ここ

void destroy(pointer p) {p->~value_type();} 

は、コンパイラエラーをトリガーするコードは次のとおりです。

#include <vector> 
#include <emmintrin.h> 
#include <tbb/cache_aligned_allocator.h> 

int main() 
{ 
    std::vector<int, tbb::cache_aligned_allocator<int> > success; 
    std::vector<__m128i, tbb::cache_aligned_allocator<__m128i> > failure; 
    return 0; 
} 

のDebianのバージョンによると、私のGCCのバージョンは4.6.1-2で、私のTBBのバージョンは3.0 + r147-1です。 これはスレッディングビルディングブロックのバグですか、何かを悪用していますか?

+0

私に同行してください...私は適切な書式を取得するために編集しようとしています。 –

+0

ありがとう!私は同時にあなたと同じ編集をしてしまった。 :D –

答えて

1

この問題は、__m128タイプがgccでどのように実装されているかにあります。それらはPOD(int/double/char/etcのような普通の古いデータ)でもクラスでもなく、C++の意味では実際の型ではありません。 vector(2) long long int識別子はgccが内部的に型を参照する方法です。あなたが示したエラーは、クラスタイプではないので、__m128iのデストラクタを見つけることができないという不平を言ったコンパイラからのものです。

この問題を回避するには、サイズが128ビットで、その代わりにそれらのベクトルを使用する独自の型を作成する必要があります。便利な場合には__m128i型のカスタムキャスト演算子を用意することもできますし、ベクトルを便利なメモリ割り当てメカニズムとして使用したい場合は、ベクトルの最初の要素へのポインタを__m128iにキャストするだけでも構いません。

+0

ありがとうございます。私は本当に便利なメモリ割り当て機構としてベクトルを使いたいだけです(私の配列が大きすぎてスタックに収まらず、非RAIIの動的配列が例外で漏れてしまうので)。私の現在の回避策は、32ビットintのベクトルを作成し、それに4倍の要素を与え、内部配列のポインタを__m128iにキャストすることです。しかし、128ビットタイプを作成することは少し洗練されたものになります。 (編集:愚かな質問を削除、ハハ。) –

関連する問題