【发布时间】:2020-09-13 16:48:04
【问题描述】:
我在 Bytes 结构中有一个固定大小的缓冲区,我想在其中复制一些数据。
目前我唯一能看到的就是从开头截取一部分,添加我想要的部分,然后在结尾添加部分,但我确信这会导致一两个大副本我想避免,我只需要更新缓冲区的中间部分。有没有不使用unsafe 的简单方法?
【问题讨论】:
我在 Bytes 结构中有一个固定大小的缓冲区,我想在其中复制一些数据。
目前我唯一能看到的就是从开头截取一部分,添加我想要的部分,然后在结尾添加部分,但我确信这会导致一两个大副本我想避免,我只需要更新缓冲区的中间部分。有没有不使用unsafe 的简单方法?
【问题讨论】:
你不要改变Bytes。结构的全部目的是表示一个引用计数的不可变数据视图。您将需要以某种方式复制数据。也许您从数据中创建了Vec<u8> 或BytesMut。
BytesMut 实现了AsMut<[u8]>、BorrowMut<[u8]> 和DerefMut,因此您可以使用任何现有技术来就地修改切片。例如:
use bytes::BytesMut; // 0.5.4
fn main() {
let mut b = BytesMut::new();
b.extend_from_slice(b"a good time");
let middle = &mut b[2..][..4];
middle.copy_from_slice(b"cool");
println!("{}", String::from_utf8_lossy(&b));
}
另见:
不使用
unsafe
请勿使用unsafe 解决此问题。您将导致未定义的行为。
【讨论】:
unsafe,然后有unsafe。我的意思是,在某些情况下您可以使用unsafe,即使您可能不想这样做,并且在某些情况下您想要的东西在语言规则范围内是不可能的,而您不得 使用unsafe 来破坏它们。这是第二种情况。如果你有一个Bytes,你不能改变它,句号。你必须回到代码给你Bytes的地方,并以某种方式说服它给你BytesMut。