Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类型别名和动态分配的数组_C++_Strict Aliasing_New Operator - Fatal编程技术网

C++ 类型别名和动态分配的数组

C++ 类型别名和动态分配的数组,c++,strict-aliasing,new-operator,C++,Strict Aliasing,New Operator,我试图通过blitz++数组库中的编译器实现自动矢量化。出于这个原因,我想展示一个数组数据的视图,它是固定长度的向量块,已经很好地进行了向量化。但是,我无法理解类型别名规则与动态分配的数组结合在一起意味着什么 这是我的想法。阵列当前由以下部分组成: T_numtype* restrict data_; 操作是通过循环这些数据来完成的。我想做的是将此数组的另一个视图显示为TinyVector数组,它是一个固定长度的向量,其操作使用表达式模板机制完全矢量化。其思想是L长度数组应该是T\u numt

我试图通过blitz++数组库中的编译器实现自动矢量化。出于这个原因,我想展示一个数组数据的视图,它是固定长度的向量块,已经很好地进行了向量化。但是,我无法理解类型别名规则与动态分配的数组结合在一起意味着什么

这是我的想法。阵列当前由以下部分组成:

T_numtype* restrict data_;
操作是通过循环这些数据来完成的。我想做的是将此数组的另一个视图显示为
TinyVector
数组,它是一个固定长度的向量,其操作使用表达式模板机制完全矢量化。其思想是L长度数组应该是
T\u numtype[L]
TinyVector[L/N]
。有没有一种方法可以做到这一点,而不违反类型松弛规则

对于静态分配的数组,可以这样做

union {
  T_numtype data_[L];
  TinyVector<T_numtype, N>[L/N];
};
但现在我似乎已经放弃了将整个数组作为T_numtype的平面数组进行寻址的权利,因此要访问特定元素,我需要执行
data[I/N].data[I%N]
,这要复杂得多

那么,有没有一种方法可以合法地创建一个由
T\u numtype data\u[L]
TinyVector[L/N]
组成的联合体,其中L是一个动态确定的大小


(我知道还有其他对齐问题,即N必须是与TinyVector成员对齐相同的值,否则数组中会有孔。)

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


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

你说的是什么意思“动态确定的大小“?就像我说的,我想用
new
来分配它。那么你是在问是否可以动态分配工会成员?你原来的问题似乎表明你正在做一些有野心的事情,但是我感觉你对C++的了解很少——但我可能错了。如果目标是重新解释原始数组作为TinyVector,这是一个区域,其中一个代码< RealTytQuase >正是医生所命令的。要么你犯规以压榨最后一滴表现,要么你稳操胜券,接受代价。不可能两全其美。我觉得结合是更高层次的杂技,增加了不必要的复杂性;TinyVector必须直接匹配阵列的内存布局。真的没有理由让这件事变得那么难。您可以保持TinyVector打开,只需硬别名(引用)阵列的存储区域?是的,重新解释TinyVector将起作用——我以前已经做过。然而,由于这段代码将进入一个通用库,如果可能的话,我希望这段代码符合标准。
typedef union {
  T_numtype data_[N];
  TinyVector<T_numtype, N>;
} u;
u* data_;
data_ = new u[L/N];