multidimensional-array - Rust 多维数组行主要且紧凑吗?

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

我正在为我的项目编写一个 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) 已经提到的那样:您不是唯一遇到此问题的人,并且已经存在专门用于此目的的类型。

关于multidimensional-array - Rust 多维数组行主要且紧凑吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37316336/

相关文章:

c# - 如何仅在二维数组的边缘选择点

enums - 在 Rust 中,有没有一种方法可以遍历枚举的值?

visual-studio-code - 如何配置运行/调试栏任务?

python - NumPy 中行与列操作的性能

python - 存在递归时保留局部变量的当前值

c - 变长多维数组

java - 如何在 Java 中操作二维数组?

graph - 如何使用Serde和Petgraph对图进行序列化和反序列化?

Python 行主要到列主要顺序向量

python - 是什么导致 numpy 中 C 有序数组与 F 有序数组沿轴的数组总和不同