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 模式
55,654 每月下载量
用于 853 个包 (24 个直接使用)
9KB
108 行
无拷贝
Rust 抽象在理论上可以是零成本的,但在实践中经常会产生很多不必要的 memcpy
调用。这个库提供了一系列针对标准容器的 trait 扩展,这些扩展暴露了更易于 LLVM 优化过程调用的 API,并且不会产生太多的复制。
背景
在 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 _);
}
游乐场 永久链接。