是的,会的。
好吧,从技术上讲编译器不会。但标准库对此有专门化。
Vec
可能会这样做。
Vec 可以使用以下任何策略或不使用以下策略,具体取决于提供的迭代器:
...
- 在支持迭代器的原始分配上就地执行迭代
实际上,目前确实如此。
pub fn foo(data: Vec<u32>) -> Vec<i32> {
data.into_iter().map(|v| v as i32).collect()
}
这将编译为以下程序集:
example::foo::h155d07d1e93916ee:
mov rax, rdi
movabs rcx, 4611686018427387903
and rcx, qword ptr [rsi + 16]
movups xmm0, xmmword ptr [rsi]
movups xmmword ptr [rdi], xmm0
mov qword ptr [rdi + 16], rcx
ret
即只移动向量。连一个循环都没有。
就地迭代仅在以下情况下有效:
Vec
和BinaryHeap
)。flatten()
、flat_map()
或 array_chunks()
,则正在进行一些复杂的计算。如果需要保证,就不要转化
Vec
,它不健全。相反,请使用 Vec::from_raw_parts()
。