| 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