像这样展平数组对于构建基元类型安全吗?

let a = [[0u32;4];4];
let b = std::mem::transmute::<[[u32;4];4], [u32; 16]>(a);

这是安全的,在什么条件下?

推荐答案

数组是Rust中为数不多的具有保证内存布局的数据 struct 之一.保证数组[T; N]在存储器中被布置为TN个连续实例.因此,[[T; M]; N]被保证具有与[T; M * N]相同的存储器布局,并且从一个到另一个的转换对于任何类型T都是安全的.

Rust相关问答推荐

即使参数和结果具有相同类型,fn的TypId也会不同

什么样的 struct 可以避免使用RefCell?

如何从接收&;self的方法克隆RC

在使用AWS SDK for Rust时,如何使用硬编码访问密钥ID和密钥凭据?

带参考文献的 rust 元组解构

如果包名称与bin名称相同,并且main.ars位于工作区的同一 crate 中,则无法添加对lib.ars的依赖

Rust LinkedList 中的borrow 判断器错误的原因是什么?

将引用移动到线程中

相当于 Rust 中 C++ 的 std::istringstream

如何基于常量在Rust中跳过一个测试

缺失serde的字段无法设置为默认值

如何从trait方法返回std :: iter :: Map?

Some(v) 和 Some(&v) 有什么区别?

如何判断服务器是否正确接收数据

在每个循环迭代中删除borrow

无法把握借来的价值不够长寿,请解释

如何获得对数组子集的工作可变引用?

当我在 struct 中存储异步函数时,为什么它需要生命周期

用逗号分隔字符串,但在标记中使用逗号

为什么一个整型变量赋值给另一个变量后仍然可以使用?