我目前最大的努力是
// `value` is a `&[u8]`
let v = unsafe { slice::from_raw_parts(value.as_ptr() as *const i8, value.len()) };在这方面需要unsafe似乎有点过头了。我希望这是零成本的。
发布于 2019-12-10 22:28:11
你的代码已经是零成本了。但它必须使用底层的不安全代码,因为当通过slice::from_parts或mem::transmute完成时,编译器并不能保证所有类型的切片转换都是安全的。无论哪个“安全”函数适合于这里,都可能包含该函数,同时确保项类型与此转换兼容(即相同的大小和内存对齐方式)。
您也许能够找到多个板条箱,这些板条箱对此转换进行了适当的测试和维护。机箱safe-transmute实现了这种转换,同时支持更多的绑定保护和对齐检查(免责声明:我是合作者之一)。
use safe_transmute::transmute_many_pedantic;
let value: &[u8] = &[0x00, 0x01, 0x12, 0x24, 0x00];
let words: &[i8] = transmute_many_pedantic(values)?;https://stackoverflow.com/questions/59268253
复制相似问题