String
和Vec<u8>
对我来说几乎是一样的,尽管String
保证有有效的UTF-8内容,这通常是有用的。
然而,在不安全的上下文中,如果不执行检查,真的需要任何机器操作来在其中两个之间进行转换吗?
考虑这两个函数:
pub unsafe fn from_utf8_unchecked(bytes: Vec<u8, Global>) -> String
pub fn into_bytes(self) -> Vec<u8, Global>
它们都在消耗输入,所以编译器理论上不需要在内存中呈现新对象。
2条答案
按热度按时间u3r8eeie1#
对于不安全版本的函数,它是一个no-op。正如你所看到的here,在没有检查的情况下将字符串转换为vec/从vec转换为字符串的程序集与vec上的identity函数相同。这并不意味着你应该仅仅为了性能而使用unsafe函数,如果通过分析你确定性能是必要的,你应该使用unsafe函数并且你可以保证你给予函数的向量总是包含vaid UTF-8。
owfi6suc2#
你可以看一下源代码来检查一下:
into_bytes()
:from_utf8_unchecked()
:所以是的。
但是,我同意@IanS的观点,除非配置文件,否则不应该使用
unsafe
。