3

我正在尝试使用 __m128i 作为 GCC 的缓存对齐向量的值类型,但出现以下错误:

/usr/include/tbb/cache_aligned_allocator.h:105:32: 错误:请求成员 '~tbb::cache_aligned_allocator<__vector(2) long long int>::value_type' in '* p', 这是非类类型 '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。这是线程构建块中的错误,还是我滥用了某些东西?

4

1 回答 1

2

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

一种解决方法可能涉及创建您自己的 128 位大小的类型并使用这些类型的向量。如果您愿意,可以为该类型提供自定义转换运算符,或者如果您只想将向量用作方便的内存分配机制__m128i,则只需将指向向量中第一个元素的指针转换为 a。__m128i

于 2011-12-16T03:57:42.803 回答