tbb :: cache_aligned_allocator:使用__m128i获取“请求成员...非类类型的成员”。用户错误或错误?

问题描述:

我试图用__m128i与GCC缓存对齐矢量的值类型,我发现了以下错误: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

请耐心等待...我试图编辑以获得正确的格式。 – 2011-12-16 03:20:56

+0

谢谢!我最终也在同一时间进行了与您一样的编辑。 :D – 2011-12-16 03:26:27

我认为问题在于如何在gcc中实现__m128类型。它们不是C++意义上的实际类型,因为它们既不是POD(简单的旧数据,比如int/double/char/etc),也不是类。 vector(2) long long int标识符是gcc如何在内部引用该类型。你显示的错误是由于编译器抱怨无法找到__m128i的析构函数,因为它不是类类型。

解决此问题的方法可能涉及创建自己的128位大小的类型,并使用这些类型的矢量。如果你愿意,你可以提供一个自定义的演员操作符到__m128i类型,或者只是将一个指向矢量中第一个元素的指针指向__m128i,如果你只是想使用vector作为一个方便的内存分配机制。