0.1.0 |
|
---|
#6 在 #vita
4KB
vita-system-alloc-wrapper
Rust 的标准库有一个 std::alloc::System
分配器,它内部调用 libc::malloc
和 libc::free
进行分配。对于 PlayStation Vita,这些函数由 newlib
提供,它使用一个 预先分配的堆内存池。
这应该可以正常工作,并且在大多数情况下都能工作。然而,不幸的是,当以专门为 PlayStation Vita 目标编译的 -O3
优化级别编译时,LLVM 可能会错误地优化 libc::free
调用,导致 Rust 中堆分配的结构体被丢弃时崩溃。
此软件包通过提供一个自定义分配器来解决这个问题,该分配器代理所有对 std::alloc::System
分配器的调用,并将 dealloc
调用包装在 std::hint::black_box
中,这阻止了 LLVM 对 libc::free
调用进行任何优化。
如果你在 PlayStation Vita 上遇到看似正确的代码中的 Drop 调用崩溃,请尝试将此软件包作为依赖项添加,并将提供的分配器注册为 GlobalAllocator
#[cfg(target_os = "vita")]
#[global_allocator]
static GLOBAL: vita_system_alloc_wrapper::SystemAllocWrapper = vita_system_alloc_wrapper::SystemAllocWrapper;
依赖项
~43KB