Rust多维数组行主要且紧密包装?

时间:2016-05-19 07:14:36

标签: multidimensional-array rust row-major-order column-major-order

我正在为我的项目编写一个3D数学库,我想知道的是Rust专栏还是行专业?例如,我有一个二维数组作为矩阵,我想将它提供给一个C库(如OpenGL或Vulkan),对于那些库,这对于一个紧密排列的列主数组很重要。

1 个答案:

答案 0 :(得分:4)

好吧,让我们找出:

let arr: [[i8; 2]; 2] = [[1, 2], [8, 9]];

println!(
    "{:?} {:?} {:?} {:?}", 
    &arr[0][0] as *const _,
    &arr[0][1] as *const _,
    &arr[1][0] as *const _,
    &arr[1][1] as *const _,
);

例如打印0x7fff5584ae74 0x7fff5584ae75 0x7fff5584ae76 0x7fff5584ae77。所以:是的,这些具有已知编译时间长度的数组是紧密排列的(考虑到术语的通用定义)行主要。

注意:上面的测试并不是说总是有效!您可以阅读有关此主题的更多信息here

但是:通常使用堆分配的数组,因为您事先无法知道长度。出于这个目的,使用Vec是惯用的。但是这种类型没有特殊规则,因此Vec<Vec<T>> 紧密包装!出于这个原因,Vec<Vec<T>> 不再是惯用语 - 您应该使用简单的Vec<T>并自行计算索引。

当然,多次编写索引计算也不是一个好的解决方案。相反,您应该定义一些包装器类型,为您进行索引。但正如塞巴斯蒂安·雷德尔已经提到的那样:你并不是唯一一个遇到这个问题的人,而且已经存在完全出于此目的的类型。