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

2024-02-05

我尝试使用 __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(使用前将#替换为@)

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

随机推荐