sách gpt4 ai đã đi

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

In lại 作者:行者123 更新时间:2023-11-29 07:56:40 26 4
mua khóa gpt4 Nike

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

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

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

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

đầu ra
}

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]

但是它是怎么做到的呢?我从未将此值赋予 đầu ra.

1 Câu trả lời

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

fn cipher_with(key: &[u8], data: &[u8]) -> Vec {
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::::with_capacity(data_len);
println!("{:?}", output.as_ptr());
unsafe { output.set_len(data_len) }

đầu ra
}
0x7fa6dba27000
0x7fa6dba1e0c0
0x7fa6dba27000

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

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

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

26 4 0
Bài viết được đề xuất: optimization - 加快循环
Bài viết được đề xuất: memory - 克隆语句是否被优化过?
Bài viết được đề xuất: java - java中的线程可以监视它启动的进程吗?
Bài viết được đề xuất: mysql_query 使用 WHERE=$var 排序
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com