- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个我不明白的问题:
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/
在已声明容量的 Vec 上调用 set_len 是否安全?像这样: let vec = unsafe { let temp = Vec::with_capacity(N); temp.
TL;博士: 如何调整(调整 length 和 capacity 的)C++ STL vector 没有任何初始化 ?垃圾值是可以接受的! 问题 我知道 STL Vector 有 resize()方法
我有一个我不明白的问题: fn cipher_with(key: &[u8], data: &[u8]) -> Vec { let data_len = 16; let mut dat
我是一名优秀的程序员,十分优秀!