【问题标题】:Is Rust multi-dimensional array row major and tightly packed?Rust 多维数组行是否主要且紧凑?
【发布时间】:2016-09-15 22:15:21
【问题描述】:

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

【问题讨论】:

  • 对于 OpenGL 和 Vulkan,您可以在着色器中使用 layout 指定您的数据是行优先还是列优先。
  • 我是 vulkan 新手,但对于 OpenGL,建议将矩阵元素按列主要顺序放置。
  • Rust 有 OpenGL (glium) 和 Vulkan (我认为是 Volkano) 的包装器,您可能应该使用它们而不是直接使用 API。

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


【解决方案1】:

好吧,让我们找出答案:

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

【讨论】:

  • Tnx,我将矩阵定义为:type Mat4x4 = [[T; 4]; 4];我没有使用 Vec。
猜你喜欢
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 2015-10-17
  • 2019-08-15
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
相关资源
最近更新 更多