3

GCC で __m128i をキャッシュ整列ベクトルの値の型として使用しようとしていますが、次のエラーが発生します。

/usr/include/tbb/cache_aligned_allocator.h:105:32: エラー: '* p' のメンバー '~tbb::cache_aligned_allocator<__vector(2) long long int>::value_type' の要求。クラス型 'tbb::cache_aligned_allocator<__vector(2) long long int>::value_type {aka __vector(2) long long int}'</p>

コンパイラは、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 です。これは Threading Building Blocks のバグですか、それとも何かを間違って使用していますか?

4

1 に答える 1

2

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

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

于 2011-12-16T03:57:42.803 に答える