#container #memcpy

无拷贝

使用标准库时消除 memcpy 调用的方法

6 个版本

0.1.5 2020 年 6 月 1 日
0.1.4 2019 年 6 月 24 日
0.1.3 2019 年 5 月 31 日
0.1.2 2019 年 3 月 19 日

#212 in Rust 模式

Download history 12949/week @ 2024-03-14 11547/week @ 2024-03-21 15860/week @ 2024-03-28 15132/week @ 2024-04-04 17726/week @ 2024-04-11 10340/week @ 2024-04-18 9548/week @ 2024-04-25 9578/week @ 2024-05-02 9280/week @ 2024-05-09 10202/week @ 2024-05-16 8988/week @ 2024-05-23 13275/week @ 2024-05-30 11161/week @ 2024-06-06 19763/week @ 2024-06-13 12947/week @ 2024-06-20 9596/week @ 2024-06-27

55,654 每月下载量
用于 853 个包 (24 个直接使用)

MIT/Apache

9KB
108

无拷贝

Build Status Crates.io

Rust 抽象在理论上可以是零成本的,但在实践中经常会产生很多不必要的 memcpy 调用。这个库提供了一系列针对标准容器的 trait 扩展,这些扩展暴露了更易于 LLVM 优化过程调用的 API,并且不会产生太多的复制。

它旨在加速 WebRendergfx-rs

背景

在 Gecko 运行的 WebRender 的配置文件中显示了 memcpy 指令。@jrmuizel 开发了一个名为 memcpy-find 的工具,该工具分析 LLVM IR 并输出最终产生 memcpy 指令的调用栈。我们找到了一种让编译器消除复制的办法。这个库试图将这些方法提供给 Rust 生态系统,至少直到编译器足够聪明;)

以下是一个简单的示例

use copyless::BoxHelper;

enum Foo {
    Small(i8),
    Big([f32; 100]),
}

#[inline(never)]
fn foo() -> Box<Foo> {
    Box::new(Foo::Small(4)) // this has 1 memcopy
    //Box::alloc().init(Foo::Small(4)) // this has 0 memcopies
}

fn main() {
    let z = foo();
    println!("{:?}", &*z as *const _);
}

游乐场 永久链接

无运行时依赖