1

私は自分のプロジェクト用に 3D 数学ライブラリを作成しています。Rust が列優先なのか行優先なのかを知りたいのですが。たとえば、行列として 2 次元配列があり、それを 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>でインデックスの計算を行う必要があります。

もちろん、インデックス計算を複数回記述することも良い解決策ではありません。代わりに、インデックス作成を行うラッパー タイプを定義する必要があります。しかし、セバスチャン・レドルがすでに述べたように、この問題を抱えているのはあなただけではなく、まさにこの目的のための型がすでに存在しています。

于 2016-05-19T07:33:44.860 に答える