1

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

4

1 回答 1

7

好吧,让我们来了解一下:

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为例。所以:是的,这些长度已知编译时间的数组是紧密打包的并且(考虑到术语的通用定义)行主要。

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

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

当然,多次编写索引计算也不是一个好的解决方案。相反,您应该定义一些为您进行索引的包装器类型。但是正如 Sebastian Redl 已经提到的:你不是唯一一个遇到这个问题的人,并且已经存在专门用于此目的的类型。

于 2016-05-19T07:33:44.860 回答