Я пытаюсь упростить автоматическую векторизацию компилятором в библиотеке массивов 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, иначе в массиве будут дыры.)