类型别名和动态分配数组

3
我希望能够通过编译器在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];
};

The closest I could think of is to define

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成员对齐相同的值,否则数组中会有空洞。)


“动态确定大小”是什么意思? - user2100815
就像我说的那样,我想用 new 来分配它。 - Lutorm
那么你是在问一个联合体的成员是否可以动态分配吗?你最初的问题似乎表明你正在做一些相当雄心壮志的事情,但我感觉你对C++知之甚少 - 但我可能错了。 - user2100815
1
如果目标是将原始数组重新解释为TinyVector,则这是那些需要使用reinterpret_cast<>的领域之一。要么你玩得很卑鄙,以挤出最后一滴性能,要么你玩得很安全并接受成本。两者不能兼得。我认为联合是更高级的技巧,增加了不必要的复杂性;TinyVector必须直接匹配数组的内存布局。真的没有理由让它变得那么难。您可以保持TinyVector开放,并只是硬别名(引用)数组的存储区域。 - sehe
是的,将reinterpret_cast转换为TinyVector会起作用 - 我以前做过这个。但是,由于此代码将进入通用库,如果可能的话,我希望代码符合标准。 - Lutorm
Neil - 实际上,我在C++方面有很多经验。这里的问题更多是关于联合和C语言,而我使用的较少。我猜“动态分配联合成员”是一种表述方式,但我的冗长问题是为了提供一些背景信息。问题的简短版本是:“是否可以像单个对象一样使用联合来别名两个动态分配的不同对象数组?” - Lutorm
1个回答

0

别名很难合法化。但是,如果一些“操作是通过循环这些数据完成的”,那么这些操作是否要求这些数据恰好是T_numtype数组?

最好将数据包装在一个类中,该类具有类型为TinyVector<T_numtype,N> [L / N]或甚至std :: vector<TinyVector<T_numtype,N> >的一个数据成员,因为L显然是在运行时确定的,并为那些希望将整个数据作为单个序列循环的操作公开一对迭代器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接