【问题标题】:Array.Copy always row-major?Array.Copy 总是行优先?
【发布时间】:2013-06-10 13:52:57
【问题描述】:

来自关于 Array.Copy 方法的 MSDN 文档:

在多维数组之间复制时,数组的行为类似于一个长的一维数组,其中行(或列)在概念上是首尾相连的。例如,如果一个数组有三行(或列),每行有四个元素,从数组的开头复制六个元素将复制第一行(或列)的所有四个元素和第二行的前两个元素(或列)。

我一直认为,在 C# 中,二维数组以row-major order 布局(对于更高维度也是如此),所以我对上述文档中括号中的“或列”的含义感到困惑.这是否意味着 .NET Framework 可能在某些情况下使用列优先排序?

【问题讨论】:

  • 这相当令人困惑。也许他们只是试图涵盖 (#rows == 1) 的情况。我很确定它总是以行优先顺序复制。否则,就会出现混乱!
  • 这也是我最初的想法,但它不适用于“三行(或列),每行四个元素”部分。我目前的猜测是,对于转换行和列定义的人来说,它是这样写的。
  • 我认为它试图成为行/列主要不可知论者;它并不关心您是否将第一个索引想象为表示行或列。
  • 并非所有语言都将数组视为行优先。例如,FORTRAN 是列优先的。 Array.Copy 的 .NET 文档必须与行/列无关。

标签: c# .net arrays multidimensional-array


【解决方案1】:

怀疑它只是试图传达一个数组不是一个矩形——它是一个单一的线性空间。任何“行”或“列”的概念实际上都是用户的发明。没有行也没有列;任何符合arr[x,y] 的约定是“第 x 行,第 y 列”或“第 x 列,第 y 行”纯粹是:约定;我们在概念化某些东西时的一部分想象力。唯一真正的顺序是首先导航哪个索引。首先?还是最后一个?

您是否称其为“行”或“列”取决于您,并且有两种在野外使用的示例。

【讨论】:

  • 我同意,尽管与主流[row,column] 约定相比,缺乏进一步解释使文章更加混乱。
  • 另外,你能指出第一个索引被称为列的任何在线资源或出版物吗?我不记得遇到过那个约定。
  • @Douglas:.NET 有一个 FORTRAN。在 FORTRAN 中,数组是列优先的。因此,该语言的任何文档都将第一个索引称为“列”。
  • @JimMischel:第一个索引(即array[x,y] 中的x)在 Fortran 中仍称为“行”。该语言被称为“column-major”,因为 columns(即由y 索引的维度)按顺序存储。尽管您提出了关于列主要语言对Array.Copy 操作的影响的有效观点。
  • (简单地说)行或列的主要顺序在使用嵌套循环迭代巨大的数组(不适合快速内存或缓存)时很重要。在行(而不是列)上使用外部循环访问列主要存储,并获得更多页面错误、缓存未命中、磁盘抖动。与从线性数组中按顺序访问项目不同,您的步幅等于列长度(行数),这不会从缓存加载中受益,因为缓存加载会使线性内存块短于列长度。使用平铺内存,编写自己的快速嵌套循环更加复杂。
猜你喜欢
  • 2019-12-15
  • 2014-09-28
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多