tbb :: cache_aligned_allocator: Получение «запроса для члена ... не относящегося к классу» с __m128i. Ошибка пользователя или ошибка? - PullRequest
3 голосов
/ 16 декабря 2011

Я пытаюсь использовать __m128i в качестве типа значения вектора с выравниванием по кэшу в GCC, и я получаю следующую ошибку:

/ usr / include / tbb / cache_aligned_allocator.h: 105: 32: ошибка: запрос для члена '~ tbb :: cache_aligned_allocator <__ vector (2) long long int> :: value_type' в '* p', что неклассового типа '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. Это ошибка в Threading Building Blocks, или я что-то неправильно использую?

1 Ответ

2 голосов
/ 16 декабря 2011

Я думаю, что проблема заключается в том, как типы __m128 реализованы в gcc.Они не являются действительными типами в смысле C ++, в том смысле, что они не являются ни POD (Plain Old Data, как int / double / char / etc.), Ни классами.Идентификатор vector(2) long long int - это то, как gcc ссылается на тип внутри.Ошибка, которую вы показали, связана с сообщением компилятора о невозможности найти деструктор для __m128i, потому что это не тип класса.

Обходной путь для этого может заключаться в создании собственного типа, который составляет 128 битпо размеру и используя вектор из них вместо.Вы можете предоставить пользовательский оператор приведения типа __m128i для удобства, если хотите, или просто привести указатель на первый элемент вектора к __m128i, если вы просто хотите использовать вектор в качестве удобного механизма выделения памяти..

...