Rust 多维数组行主要且紧凑吗?
Is Rust multi-dimensional array row major and tightly packed?
我正在为我的项目编写一个 3D 数学库,我想知道 Rust 是列专业还是行专业?例如,我有一个二维数组作为矩阵,我想将它提供给 C 库(如 OpenGL 或 Vulkan),对于这些库来说,拥有一个紧凑的列主数组很重要。
好吧,让我们找出答案:
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>
并自己计算索引。
当然,多次写索引计算也不是什么好办法。相反,你应该定义一些包装器类型来为你做索引。但正如 Sebastian Redl 已经提到的那样:您不是唯一遇到此问题的人,并且已经存在专门用于此目的的类型。
我正在为我的项目编写一个 3D 数学库,我想知道 Rust 是列专业还是行专业?例如,我有一个二维数组作为矩阵,我想将它提供给 C 库(如 OpenGL 或 Vulkan),对于这些库来说,拥有一个紧凑的列主数组很重要。
好吧,让我们找出答案:
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>
并自己计算索引。
当然,多次写索引计算也不是什么好办法。相反,你应该定义一些包装器类型来为你做索引。但正如 Sebastian Redl 已经提到的那样:您不是唯一遇到此问题的人,并且已经存在专门用于此目的的类型。