C++ 递归定义数组中的数据对齐和排序
我有一个关于递归定义数组中数据的排序和对齐的问题。考虑下面的代码C++ 递归定义数组中的数据对齐和排序,c++,arrays,recursion,C++,Arrays,Recursion,我有一个关于递归定义数组中数据的排序和对齐的问题。考虑下面的代码 template<int rank, int dim, class T> struct recursive_array; template<int dim,class Tp> struct recursive_array <0,dim,Tp> { using value_type = Tp; recursive_array<0,dim,Tp>& oper
template<int rank, int dim, class T> struct recursive_array;
template<int dim,class Tp>
struct recursive_array <0,dim,Tp> {
using value_type = Tp;
recursive_array<0,dim,Tp>& operator=(Tp const& val)
{
value = val;
return *this;
}
operator Tp &() {return value;}
value_type value;
};
template<int rank, int dim, class Tp>
struct recursive_array {
using value_type = recursive_array<rank-1, dim, Tp>;
recursive_array<0,dim,Tp>& operator=(Tp const& val)
{
for(int i = 0; i < dim; ++i)
values[i] = val;
return *this;
}
value_type& operator[] (unsigned int const i)
{
return values[i];
}
value_type values[dim];
};
这将创建以下输出
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
13 13
14 14
15 15
当使用递归_数组
时,数据似乎是连续存储的,这与c样式数组的情况相同。这是符合,但也是说,
条目的显示顺序[…]未定义
还是我遗漏了什么
但是,与本文档所述内容无关,我有兴趣了解上述代码的总体工作原理
我使用gcc 6.3编译了上面的代码,带有
-std=c++11-O0
和-std=c++11-O3
标志,两次我都得到了相同的结果;我没有为ArrayView
编写特定的构造函数,但我认为我仍然可以回答您的问题
请注意:deal.II
邮件列表非常活跃,是回答类似问题的好地方
简本
该评论是沙袋式的,只是说我们可能会在将来的某个时候修改Tensor
的布局:因此,明确不鼓励依赖事物变平时的顺序
较长版本
几年前(2015年秋季),我们重写了整个
张量
类,其定义基本上与您的示例相同;重新实现了与operator[]
和friends的公共接口,以保持兼容性,但底层存储顺序改变了IIRC(我们从硬编码一些较低级别的代码改为递归执行所有操作)。如果出于某种原因再次更改实现,那么内存中的顺序将不同;因此评论。我相信该评论的作者试图表达的观点是“我们可能会在将来改变事情的实施方式,所以现在不要依赖事情的顺序。”也许这只是意味着他们保留更改嵌套顺序或其他事情的权利?“条目的显示顺序”与语言或实现的关系并不明显,它可能只是一个库术语,这是可能的,但我也不确定。从我的角度来看,对齐似乎是有保证的,这听起来很奇怪,但顺序却不是;谢谢你指出这一点!见,谢谢David,但是你能解释一下为什么数据是一致的吗?递归数组总是这样吗?我想了解c/c++在这种特殊情况下是如何工作的。如果你能补充这一点,我会接受你的回答。
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
13 13
14 14
15 15