rust String和Vec之间的转换< u8>在--release二进制文件中是没有操作的吗?

cu6pst1q  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(131)

StringVec<u8>对我来说几乎是一样的,尽管String保证有有效的UTF-8内容,这通常是有用的。
然而,在不安全的上下文中,如果不执行检查,真的需要任何机器操作来在其中两个之间进行转换吗?
考虑这两个函数:

  • pub unsafe fn from_utf8_unchecked(bytes: Vec<u8, Global>) -> String
  • pub fn into_bytes(self) -> Vec<u8, Global>

它们都在消耗输入,所以编译器理论上不需要在内存中呈现新对象。

u3r8eeie

u3r8eeie1#

对于不安全版本的函数,它是一个no-op。正如你所看到的here,在没有检查的情况下将字符串转换为vec/从vec转换为字符串的程序集与vec上的identity函数相同。这并不意味着你应该仅仅为了性能而使用unsafe函数,如果通过分析你确定性能是必要的,你应该使用unsafe函数并且你可以保证你给予函数的向量总是包含vaid UTF-8。

owfi6suc

owfi6suc2#

你可以看一下源代码来检查一下:
into_bytes()

pub fn into_bytes(self) -> Vec<u8> {
    self.vec
}

from_utf8_unchecked()

pub unsafe fn from_utf8_unchecked(bytes: Vec<u8>) -> String {
    String { vec: bytes }
}

所以是的。
但是,我同意@IanS的观点,除非配置文件,否则不应该使用unsafe

相关问题