#string #heap-allocation #needing #pass #short #byte #buffer

cfixed-string

将Rust字符串传递到C,可能无需堆分配

1 个稳定版本

1.0.0 2021年9月11日

#437 in 内存管理


用于 bgfx-rs

MIT 许可证

13KB
262

Build Status Crates.io Documentation

cfixed-string用于将Rust字符串传递到C,可能无需进行堆分配。

使用标准库CString的问题在于,它总是会分配堆内存,即使你试图使用的字符串非常短。这可能导致性能问题,并可能根据你的系统增加内存碎片。

CFixedString将具有512字节的栈缓冲区,然后在调用FFI函数时使用。这允许字符串(包括空终止符)长度小于512个字符的字符串在栈上而不是在堆上,从而消除了内存分配和释放的需要。如果字符串更长,它将回退到标准库中的CString

使用方法

# Cargo.toml
[dependencies]
cfixed-string = "1.0"

示例

use cfixed_string::CFixedString;

fn main() {
	// Create a string that will be stored on the stack
	let ffi_str = CFixedString::from_str("test");
	// And pass it to the FFI function
	ffi_func(ffi_str.as_ptr());

	// It's also possible to format a string directly on the stack if it fits using the format_c macro
	let fmt_str = format_c!("hello {}", 123);
	// And pass it to the FFI function
	ffi_func(ffi_str.as_ptr());
}

无运行时依赖