在 String & Vec<u8> 之间转换 --release binary 中的零操作

Is converting between String & Vec<u8> a zero-op in --release binary

StringVec<u8> 对我来说几乎是一样的,尽管 String 保证具有有效的 UTF-8 内容,这通常很有用。

但是,在不安全的上下文中,如果不执行检查,是否真的需要任何机器操作才能在两者之间转换?

考虑这两个函数:

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

对于函数的不安全版本,它是 no-op。如您所见here,用于将字符串into/from 转换为不带检查的vec 的程序集与vec 上的恒等函数相同。这并不意味着你应该只使用不安全函数来提高性能,如果通过分析你确定性能是必要的,你应该使用不安全函数 and 你可以保证你给的向量函数将始终包含 vaid UTF-8。

你可以看一下源码看看:

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 除非被分析。