Является ли строка многомерного массива Rust основной и плотно упакованной?
Я пишу трехмерную математическую библиотеку для своего проекта, я хочу знать, является ли столбец Rust мажор или мажор строки? Например, у меня есть двумерный массив в качестве матрицы, и я хочу передать его в библиотеку C (например, OpenGL или Vulkan), для этих библиотек важно иметь плотно упакованный основной массив столбцов.
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
например. Итак: да, эти массивы с длиной, известной для компиляции времени, плотно упакованы и (с учетом общего определения терминов) строки Major.
Примечание: тест выше не говорит, что это всегда работает! Вы можете прочитать больше об этой теме здесь.
Но: обычно вы используете распределенные массивы кучи, так как вы не можете знать длину заранее. Для этого идиоматично использовать Vec
, Но нет особых правил для этого типа, поэтому Vec<Vec<T>>
не плотно упакован! По этой причине Vec<Vec<T>>
больше не идиоматичен - вы должны использовать простой Vec<T>
и сделать расчет индекса самостоятельно.
Конечно, многократное написание расчета индексации также не является хорошим решением. Вместо этого вы должны определить некоторый тип оболочки, который выполняет индексацию за вас. Но, как уже упоминал Себастьян Редл: у вас не одна такая проблема, и для этой цели уже есть типы.