在 String & Vec<u8> 之间转换 --release binary 中的零操作
Is converting between String & Vec<u8> a zero-op in --release binary
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>
它们都在消耗输入,因此编译器理论上不需要在内存中呈现新对象。
对于函数的不安全版本,它是 no-op。如您所见here,用于将字符串into/from 转换为不带检查的vec 的程序集与vec 上的恒等函数相同。这并不意味着你应该只使用不安全函数来提高性能,如果通过分析你确定性能是必要的,你应该使用不安全函数 and 你可以保证你给的向量函数将始终包含 vaid UTF-8。
你可以看一下源码看看:
pub fn into_bytes(self) -> Vec<u8> {
self.vec
}
pub unsafe fn from_utf8_unchecked(bytes: Vec<u8>) -> String {
String { vec: bytes }
}
是的。
但是,我同意@IanS 的观点,你不应该使用 unsafe
除非被分析。
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>
它们都在消耗输入,因此编译器理论上不需要在内存中呈现新对象。
对于函数的不安全版本,它是 no-op。如您所见here,用于将字符串into/from 转换为不带检查的vec 的程序集与vec 上的恒等函数相同。这并不意味着你应该只使用不安全函数来提高性能,如果通过分析你确定性能是必要的,你应该使用不安全函数 and 你可以保证你给的向量函数将始终包含 vaid UTF-8。
你可以看一下源码看看:
pub fn into_bytes(self) -> Vec<u8> {
self.vec
}
pub unsafe fn from_utf8_unchecked(bytes: Vec<u8>) -> String {
String { vec: bytes }
}
是的。
但是,我同意@IanS 的观点,你不应该使用 unsafe
除非被分析。