我正在尝试通过 blitz++ 数组库中的编译器来促进自动矢量化。出于这个原因,我想展示固定长度向量块中的数组数据的视图,这些向量已经很好地向量化了。但是,我无法弄清楚类型别名规则与动态分配的数组一起意味着什么。
这是想法。一个数组目前包括
T_numtype* restrict data_;
操作是通过循环这些数据来完成的。我想做的是将此数组的另一种视图呈现为 的数组TinyVector<T_numtype, N>
,它是一个固定长度的向量,其操作使用表达式模板机制完全向量化。这个想法是 L 长度数组应该是T_numtype[L]
or 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 成员的对齐方式相同的值,否则数组中会有孔。)