什么是转换[[T; 4]; 3]成[T; 12]?

apt*_*002 6 unsafe multidimensional-array rust

据我了解,a [[T; 4]; 3]和a [T; 12]在内存中具有相同的布局.在这些类型之间转换值的最佳方法是什么?我可以将引用转换为对另一个的引用吗?我可以避免复制所有元素吗?我需要unsafe吗?

Fra*_*gné 9

是的,您可以将对a的引用转换为对a [[T; 4]; 3]的引用[T; 12],但仅使用不安全的代码mem::transmute.最好将其包装在一个函数中,以便为结果引用分配适当的生命周期,否则transmute将有可能获得具有比引用应具有的更长生命周期的引用.

fn convert<'a>(a: &'a [[u8; 4]; 3]) -> &'a [u8; 12] {
    unsafe { std::mem::transmute(a) }
}
Run Code Online (Sandbox Code Playgroud)

由于终身省略规则,这可以缩短:

fn convert(a: &[[u8; 4]; 3]) -> &[u8; 12] {
    unsafe { std::mem::transmute(a) }
}
Run Code Online (Sandbox Code Playgroud)

虽然在处理不安全的代码时,我会理解你是否更喜欢更明确的版本!

  • @Simon:如果将_reference_转换为数组,则只复制引用.如果您直接转换_array_(就像在答案中所做的那样),则会复制整个数组.但是,编译器可能会删除副本,具体取决于您对值的处理方式以及编译代码的方式(调试或发布). (3认同)