我有几个关于多维数组的问题。我了解如何为他们分配内存,但我不明白为什么需要(除了让事情更具可读性)。
数组的[]
运算符重载了,对吧?那么,为什么不能分配单个内存块并授予访问权限1dArray[i*nInRow][offset]
?
通过在多个维度中使用数组是否有进一步的性能提升?此外,当为二维数组动态分配内存时,它们是存储在连续的位置,还是分散在堆周围?当请求数据时,我可以假设所有内容都是作为一个块从内存中提取的吗?
我看到的大部分信息都只是解释了语法。任何答案或建议阅读都会很棒。
数组的 [] 运算符重载了,对吧?那么,为什么不能通过 1dArray[i*nInRow][offset] 分配单个内存块并授予访问权限?
它可以,事实上我会在一般情况下推荐这个。
通过在多个维度中使用数组是否有进一步的性能提升?
并不真地。根据您的布局,您可以优化缓存命中,但对于展平的一维数组也是如此。两者之间的内存布局(通常)完全相同。唯一的区别是数组的语义类型以及您现在必须自己实现 2D 元素查找这一事实。
此外,当为二维数组动态分配内存时,它们是存储在连续的位置,还是分散在堆周围?当请求数据时,我可以假设所有内容都是作为一个块从内存中提取的吗?
数组总是连续的。
尽管您实际上是在分配 2D 数组,但您应该小心。有些人编写int** ptr = new int*[2]
然后手动分配每个“子数组”,并认为他们有一个二维数组。他们不。他们有一个指针数组,这就是你得到“分散”布局的时候。您的二维数组是int (*ptr)[3] = new int[2][3];
.
首先,存在多维问题。其次,如果多维问题是“稀疏的”,分配 99*99*99*99*...*99 个元素是没有意义的,而只是指向下一级结构的指针,这些结构被巧妙的语法数组隐藏 [ n][i][j][k]...
例如,虚拟内存和页表在现代操作系统和 CPU 中以这种方式运行。
二维数组有两种类型:
1)所有内存都在一个大块中的那种,和
2)每一行(或每一列)都是连续的,但各个行分散在周围,并且您有一个指向每一行的指针数组。
如果您想要执行某些操作(例如交换行),Type #2 具有更好的性能,因为您所要做的就是交换两个指针。