Тип псевдонимов и динамически размещаемые массивы - PullRequest
3 голосов
/ 24 мая 2011

Я пытаюсь упростить автоматическую векторизацию компилятором в библиотеке массивов blitz ++. По этой причине я хотел бы представить представление данных массива в виде фрагментов векторов фиксированной длины, которые уже хорошо векторизованы. Однако я не могу понять, что подразумевают правила псевдонимов типов в сочетании с динамически размещаемыми массивами.

Вот идея. В настоящее время массив состоит из

T_numtype* restrict data_;

Операции выполняются путем зацикливания этих данных. Я хотел бы представить альтернативное представление этого массива в виде массива TinyVector<T_numtype, N>, который представляет собой вектор фиксированной длины, операции которого полностью векторизуются с использованием механизма шаблонного выражения. Идея состоит в том, что массив L-длины должен быть либо T_numtype[L], либо TinyVector<T_numtype, N>[L/N]. Есть ли способ сделать это, не нарушая правил алиасинга типов?

Для статически размещенного массива можно сделать

union {
  T_numtype data_[L];
  TinyVector<T_numtype, N>[L/N];
};

Самое близкое, что я могу придумать, это определить

typedef union {
  T_numtype data_[N];
  TinyVector<T_numtype, N>;
} u;
u* data_;

и затем выделите его с помощью

data_ = new u[L/N];

Но, похоже, теперь я отказался от своего права обращаться к массиву весь как к плоскому массиву T_numtype, поэтому для доступа к конкретному элементу мне нужно было бы сделать data_[i/N].data_[i%N], который является намного сложнее.

Итак, существует ли способ юридически создать объединение T_numtype data_[L] и TinyVector<T_numtype, N>[L/N], где L - это динамически определенный размер?

(Я знаю, что существуют дополнительные проблемы с выравниванием, т. Е. N должно быть значением, совпадающим с выравниванием элемента TinyVector, иначе в массиве будут дыры.)

1 Ответ

0 голосов
/ 24 мая 2011

Псевдоним трудно сделать легальным.Однако если некоторые «операции выполняются с помощью циклического перебора этих данных.», Требуют ли эти операции, чтобы эти данные были в точности массивом T_numtype?член типа TinyVector<T_numtype, N>[L/N] или даже std::vector<TinyVector<T_numtype, N> >, поскольку этот L, по-видимому, определяется во время выполнения и предоставляет пару итераторов для тех операций, которые хотят перебрать все данные в виде одной последовательности.

...