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