gpt4 book ai didi

c++ - 递归定义数组中的数据对齐和排序

转载 作者:行者123 更新时间:2023-11-28 04:47:05 26 4
gpt4 key购买 nike

我有一个关于递归定义数组中数据的排序和对齐的问题。考虑以下代码

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];
};

recursive_array 的唯一成员是 rank-1recursive_array 的普通旧 c 数组。在递归结束时,即 rank == 0,唯一的成员 value 包含实际数据。此技术用于有限元库 deal.II描述一类通用张量,以防万一你想知道为什么我不使用普通的 c 风格数组。

现在让我们使用 recursive_array 类和一个普通的旧 c 风格数组定义一个 2 x 2 x 2 x 2 整数数组,并比较它们在内存中的数据布局

//main.cc
#include<iostream>

int main () {

recursive_array<4,2,int> arr;
int carr[2][2][2][2];

for(int i = 0; i < 2; ++i)
for(int j = 0; j < 2; ++j)
for(int k = 0; k < 2; ++k)
for(int l = 0; l < 2; ++l){

int idx = i*8 + j*4 + k*2 + l;

arr[i][j][k][l] = idx;
carr[i][j][k][l] = idx;

std::cout << ((int*)&(arr[0][0][0][0]))[idx] << " "
<< ((int*)&(carr[0][0][0][0]))[idx] << std::endl;
}

return 0;
}

创建以下输出

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

当使用 recursive_array 时,数据似乎是连续存储的,就像 c 风格数组的情况一样。这符合 deal.II documentation , 但它也说

the order in which the entries are presented [...] is undefined.

还是我遗漏了什么?

但是,不管这个文档说了什么,我有兴趣了解上面的代码一般是如何工作的。

  1. 为什么上述代码的数据存储在连续的内存块中?
  2. 这是有保证的吗?
  3. 当数据连续存储时,元素的顺序是什么?

非常感谢您!

我使用带有 -std=c++11 -O0-std=c++11 -O3 标志的 gcc 6.3 编译了上面的代码,两次我得到了相同的结果。

最佳答案

我是 deal.II 的主要开发者之一;我没有为 ArrayView 编写特定的构造函数,但我想我仍然可以回答您的问题。

郑重声明:deal.II 邮件列表非常活跃,是解决此类问题的好地方。

简要版

那条评论是沙袋,只是说我们可能会在未来的某个时候修改 Tensor 的布局:因此,明确不鼓励依赖事物在展平时的顺序。

更长的版本

我们在几年前(2015 年秋季)重写了整个 Tensor 类,其定义方式与您的示例基本相同;与 operator[] 和 friend 的公共(public)接口(interface)被重新实现以保持兼容性,但底层存储顺序改变了 IIRC(我们从硬编码一些较低级别的代码到递归地做所有事情)。如果我们出于某种原因再次更改实现,那么内存中的顺序将会不同;因此评论。我相信该评论的作者试图表达的意思是“我们可能会改变 future 的实现方式,所以现在不要依赖事物的顺序”。

关于c++ - 递归定义数组中的数据对齐和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49071748/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com