我尝试使用 __m128i 作为 GCC 缓存对齐向量的值类型,但出现以下错误:
/usr/include/tbb/cache_aligned_allocator.h:105:32: 错误:请求 '* p' 中的成员 '~tbb::cache_aligned_allocator<__vector long int>::value_type',它是非类类型 'tbb::cache_aligned_allocator<__vector 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。
这是线程构建块中的错误,还是我滥用了某些东西?
我认为问题在于如何__m128
类型在 gcc 中实现。它们不是 C++ 意义上的实际类型,因为它们既不是 POD(普通旧数据,如 int/double/char/ 等)也不是类。这vector(2) long long int
标识符是 gcc 在内部引用类型的方式。您显示的错误来自编译器抱怨无法找到析构函数__m128i
因为它不是一个类类型。
解决此问题的方法可能包括创建您自己的 128 位大小的类型并使用这些类型的向量。您可以向__m128i
如果需要,请键入以方便起见,或者只需将指向向量中第一个元素的指针转换为__m128i
如果您只想使用向量作为方便的内存分配机制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)