.net 在C#中使用System.Buffers(ArrayPool)创建矩阵

3phpmpom  于 2022-12-14  发布在  .NET
关注(0)|答案(1)|浏览(297)

我想用System.Buffers或ArrayPool在C#中创建一个矩阵,这可能吗?
所有的例子看起来都是一维数组,或者是固定大小的锯齿数组。
我不想创建一个多维数组(交错数组),我想创建一个矩阵,因为它将被用来通过互操作传递一些数据。
例如:

var matrix = new object[9000,9000];
cunj1qz1

cunj1qz11#

简短的回答是“不,你需要线性化”; ArrayPool<T>仅处理向量,即具有零基线偏移的一维阵列;这部分是因为它们是最常见的场景,部分是因为缓存命中-即,如果您只需要考虑单个大小维度,则很容易池化数组,并且很有可能重用它们,但如果您需要考虑两个维度(或更多)维,重用的语义变得复杂得多,并且“命中”(即重用的缓冲区)的数量显著下降(在一般情况下)。
从根本上讲,数组的实际 * 有效负载 * 空间在所有情况下都是相同的--它只是一个内存块,大小是所有维度的倍数--所以T[n,m]T[n*m]的 * 有效负载大小相同。当讨论互操作时,您最终只是传递内存的根地址,而消费者需要进行非线性化,因此:也许在第一个地方使用一个向量,然后使用互操作层所需的任何维度顺序去线性化。

相关问题