#stack #memory #fixed-size #fastest #simplest #primitive #data-structures

microstack

这是在栈上实现的固定大小栈的最简单和最快的实现

7个版本

0.0.7 2023年5月15日
0.0.6 2023年5月15日

#334内存管理

MIT 许可证

26KB
402

cargo crates.io codecov Hits-of-Code Lines of code License docs.rs

这是在栈上实现的最简单和最快的(比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 fmtcargo clippy

此外,在开始修改之前,运行基准测试。

$ rustup run nightly cargo bench

然后,在做出更改后再次运行。比较结果。如果您的更改降低了性能,在提交pull request之前请三思。

依赖项

~170KB