我想用System.Buffers或ArrayPool在C#中创建一个矩阵,这可能吗?所有的例子看起来都是一维数组,或者是固定大小的锯齿数组。我不想创建一个多维数组(交错数组),我想创建一个矩阵,因为它将被用来通过互操作传递一些数据。例如:
var matrix = new object[9000,9000];
cunj1qz11#
简短的回答是“不,你需要线性化”; ArrayPool<T>仅处理向量,即具有零基线偏移的一维阵列;这部分是因为它们是最常见的场景,部分是因为缓存命中-即,如果您只需要考虑单个大小维度,则很容易池化数组,并且很有可能重用它们,但如果您需要考虑两个维度(或更多)维,重用的语义变得复杂得多,并且“命中”(即重用的缓冲区)的数量显著下降(在一般情况下)。从根本上讲,数组的实际 * 有效负载 * 空间在所有情况下都是相同的--它只是一个内存块,大小是所有维度的倍数--所以T[n,m]与T[n*m]的 * 有效负载大小相同。当讨论互操作时,您最终只是传递内存的根地址,而消费者需要进行非线性化,因此:也许在第一个地方使用一个向量,然后使用互操作层所需的任何维度顺序去线性化。
ArrayPool<T>
T[n,m]
T[n*m]
1条答案
按热度按时间cunj1qz11#
简短的回答是“不,你需要线性化”;
ArrayPool<T>
仅处理向量,即具有零基线偏移的一维阵列;这部分是因为它们是最常见的场景,部分是因为缓存命中-即,如果您只需要考虑单个大小维度,则很容易池化数组,并且很有可能重用它们,但如果您需要考虑两个维度(或更多)维,重用的语义变得复杂得多,并且“命中”(即重用的缓冲区)的数量显著下降(在一般情况下)。从根本上讲,数组的实际 * 有效负载 * 空间在所有情况下都是相同的--它只是一个内存块,大小是所有维度的倍数--所以
T[n,m]
与T[n*m]
的 * 有效负载大小相同。当讨论互操作时,您最终只是传递内存的根地址,而消费者需要进行非线性化,因此:也许在第一个地方使用一个向量,然后使用互操作层所需的任何维度顺序去线性化。