Rust 编译器完成的迭代器优化

问题描述 投票:0回答:1
rust unsafe
1个回答
0
投票

是的,会的。

好吧,从技术上讲编译器不会。但标准库对此有专门化。

文档甚至说

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

即只移动向量。连一个循环都没有。

就地迭代仅在以下情况下有效:

  • 源类型和目标类型的对齐方式相同。
  • 使用的迭代器适配器来自 std(因为只有它们实现了所需的特征)。
  • 原始集合支持就地迭代(仅
    Vec
    BinaryHeap
    )。
  • 如果管道中有
    flatten()
    flat_map()
    array_chunks()
    ,则正在进行一些复杂的计算

实现在这里

如果需要保证,就不要转化

Vec
,它不健全。相反,请使用
Vec::from_raw_parts()

© www.soinside.com 2019 - 2024. All rights reserved.