Вы хотите Vec::extend_from_slice
:
fn vec_copy(src: &[i32], dst: &mut Vec<i32>) {
// Optionally truncate to zero if there might be existing data
// dst.clear();
dst.extend_from_slice(src);
}
Это позволяет избежать необходимости заполнять вектор «фиктивными значениями» при добавлении большего количества элементов, чем было выделено ранее.
Если вы посмотрите на сборку в режиме выпуска, она вызывает memcpy
после того, как выясняет, достаточно ли выделенного пространства:
playground::vec_copy:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $88, %rsp
movq %rdx, %rbx
movq %rsi, %r15
movq %rdi, %r14
movq 8(%rbx), %rsi
movq 16(%rbx), %r12
movq %rsi, %rax
subq %r12, %rax
cmpq %r15, %rax
jae .LBB1_14
addq %r15, %r12
jb .LBB1_8
leaq (%rsi,%rsi), %rax
cmpq %rax, %r12
cmovbq %rax, %r12
movl $4, %ecx
movq %r12, %rax
mulq %rcx
jo .LBB1_8
testq %rsi, %rsi
je .LBB1_9
shlq $2, %rsi
movq (%rbx), %rdi
movq %rsp, %r9
movl $4, %edx
movl $4, %r8d
movq %rax, %rcx
callq __rust_realloc@PLT
testq %rax, %rax
jne .LBB1_5
movq (%rsp), %rax
jmp .LBB1_12
.LBB1_9:
movq %rsp, %rdx
movl $4, %esi
movq %rax, %rdi
callq __rust_alloc@PLT
testq %rax, %rax
je .LBB1_12
.LBB1_5:
xorl %ecx, %ecx
movdqa 32(%rsp), %xmm0
movdqa %xmm0, 48(%rsp)
testq %rcx, %rcx
je .LBB1_13
.LBB1_6:
movq %rax, (%rsp)
movaps 48(%rsp), %xmm0
movups %xmm0, 8(%rsp)
leaq 64(%rsp), %rdi
movq %rsp, %rsi
callq <core::heap::CollectionAllocErr as core::convert::From<core::heap::AllocErr>>::from@PLT
movdqa 64(%rsp), %xmm0
movq %xmm0, %rax
cmpq $3, %rax
je .LBB1_14
cmpq $2, %rax
jne .LBB1_15
.LBB1_8:
leaq .Lbyte_str.5(%rip), %rdi
callq core::panicking::panic@PLT
ud2
.LBB1_12:
movups 8(%rsp), %xmm0
movaps %xmm0, 32(%rsp)
movl $1, %ecx
movdqa 32(%rsp), %xmm0
movdqa %xmm0, 48(%rsp)
testq %rcx, %rcx
jne .LBB1_6
.LBB1_13:
movq %rax, (%rbx)
movq %r12, 8(%rbx)
.LBB1_14:
movq 16(%rbx), %rdi
leaq (%rdi,%r15), %rax
movq %rax, 16(%rbx)
shlq $2, %r15
shlq $2, %rdi
addq (%rbx), %rdi
movq %r14, %rsi
movq %r15, %rdx
callq memcpy@PLT
addq $88, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
.LBB1_15:
movq 80(%rsp), %rax
movdqa %xmm0, (%rsp)
movq %rax, 16(%rsp)
movq %rsp, %rdi
callq <alloc::heap::Heap as core::heap::Alloc>::oom
ud2
println!("{:p} = {:?}", &container[0], container);
container.as_ptr()
более очевиден, чем &container[0]
, и не потерпит неудачу, когда вектор пуст.
См. Также: