apt*_*002 6 unsafe multidimensional-array rust
据我了解,a [[T; 4]; 3]和a [T; 12]在内存中具有相同的布局.在这些类型之间转换值的最佳方法是什么?我可以将引用转换为对另一个的引用吗?我可以避免复制所有元素吗?我需要unsafe吗?
是的,您可以将对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)
虽然在处理不安全的代码时,我会理解你是否更喜欢更明确的版本!