gpt4 book ai didi

arrays - 为什么在调用 Vec::set_len 之前调用 Vec::resize 会导致 Vec 有数据?

转载 作者:行者123 更新时间:2023-11-29 07:56:40 25 4
gpt4 key购买 nike

我有一个我不明白的问题:

fn cipher_with(key: &[u8], data: &[u8]) -> Vec<u8> {
let data_len = 16;

let mut data = data.to_vec();
data.resize(data_len, 2);

let mut output = Vec::<u8>::with_capacity(data_len);
unsafe { output.set_len(data_len) }

output
}

fn main() {
let key = "blabla".as_bytes();
let data = "lorem ipsum.".as_bytes();
println!("{:?}", cipher_with(&key, &data));
}

这打印:

[108, 111, 114, 101, 109, 32, 105, 112, 115, 117, 109, 46, 0, 0, 0, 0]

但是它是怎么做到的呢?我从未将此值赋予 output

最佳答案

Peter's answer添加一些细节, 查看这个带注释的版本:

fn cipher_with(key: &[u8], data: &[u8]) -> Vec<u8> {
let data_len = 16;

let mut data = data.to_vec();
println!("{:?}", data.as_ptr());
data.resize(data_len, 2);
println!("{:?}", data.as_ptr());

let mut output = Vec::<u8>::with_capacity(data_len);
println!("{:?}", output.as_ptr());
unsafe { output.set_len(data_len) }

output
}
0x7fa6dba27000
0x7fa6dba1e0c0
0x7fa6dba27000

创建第一个向量时,它的长度为 12。当它的大小调整为 16 时,会进行新的分配并复制数据。这可能是由于分配器的实现,它通常将分配分块到桶中。 16 将是一个合理的存储桶大小。

当创建第二个向量时,分配器交回与第一个向量刚刚放弃的指针相同的指针。由于在此期间没有其他任何东西更改此内存,因此它仍然包含 data 中的所有数据。

关于arrays - 为什么在调用 Vec::set_len 之前调用 Vec::resize 会导致 Vec 有数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43057950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com