7个版本
0.0.7 | 2023年5月15日 |
---|---|
0.0.6 | 2023年5月15日 |
#334 在 内存管理
26KB
402 行
这是在栈上实现的最简单和最快的(比Vec
!) 先入后出栈数据结构,当栈元素是实现了原语的Copy
时。这基本上是一个围绕未初始化数组的包装。当它在栈上创建时,其元素不包含特定数据。然后,当你调用push_unchecked(x)
时,栈头向前移动,并将x
放入数组的元素中。当你调用pop_unchecked()
时,栈头向后移动,并从数组中检索数据。没有边界检查,这就是为什么push_unchecked()
和pop_unchecked()
可能会导致未定义的行为。请使用更安全的,但速度较慢的push()
和pop()
。对于更慢但更安全的操作,您可以使用try_push()
和try_pop()
。
首先,将以下内容添加到Cargo.toml
[dependencies]
microstack = "0.0.5"
然后,像这样使用它(注意unsafe
块,它们提供最快的性能,但如果你超出栈边界,将会出现未定义行为)
use microstack::Stack;
let mut s : Stack<&str, 10> = Stack::new(); // allocation on stack
unsafe { s.push_unchecked("foo") }; // no boundary checks here
unsafe { s.push_unchecked("bar") }; // and here
assert_eq!("bar", unsafe { s.pop_unchecked() });
assert_eq!(1, s.len());
请注意,这里使用了一个额外的泛型参数 10
创建了栈。这是栈数据结构的大小总和,当调用 ::new()
时,它会在栈上分配。
阅读 API 文档。
如何贡献
首先,安装 Rust 然后进行操作。
$ cargo test -vv
如果一切顺利,请fork仓库,进行修改,然后发送给我们一个 pull request。我们会尽快审查您的更改并将其应用到 master
分支,前提是它们没有违反我们的质量标准。为了避免失望,在发送给我们pull request之前,请再次运行 cargo test
。另外,运行 cargo fmt
和 cargo clippy
。
此外,在开始修改之前,运行基准测试。
$ rustup run nightly cargo bench
然后,在做出更改后再次运行。比较结果。如果您的更改降低了性能,在提交pull request之前请三思。
依赖项
~170KB