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

Ogr*_*mny 3 arrays vector slice rust

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

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));
}
Run Code Online (Sandbox Code Playgroud)

这打印:

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

但它是如何完成的?我从未给过这个价值output.

She*_*ter 5

要向Peter的答案添加一些细节,请查看这个带注释的版本:

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
}
Run Code Online (Sandbox Code Playgroud)
0x7fa6dba27000
0x7fa6dba1e0c0
0x7fa6dba27000
Run Code Online (Sandbox Code Playgroud)

创建第一个向量时,它的长度为12.当它被调整为16时,将进行新的分配并复制数据.这可能是由于分配器的实现,分配器通常将分配分块到桶中.16将是合理的铲斗尺寸.

当创建第二个向量时,分配器会将第一个向量放弃的相同指针移回.由于没有其他东西同时改变了这个内存,它仍然包含所有数据data.