如何在Rust中将u64打印到栈上缓冲区
无堆分配把u64转成&str的靠谱方案
方法一:用Cursor配合标准库write!宏
你之前踩的坑是直接对&mut [u8]用write!,但&mut [u8]根本没实现Write trait。换用std::io::Cursor包裹缓冲区就行,它不仅实现了Write,还能追踪写入位置,直接拿到格式化后的字符串长度:
use std::io::{self, Write}; use std::io::Cursor; fn u64_to_stack_str(i: u64) -> &'static str { // u64最大是18446744073709551615,一共20位,这个缓冲区大小完全够 let mut buffer = [0u8; 20]; let mut cursor = Cursor::new(&mut buffer[..]); // 把数字格式化写入缓冲区 let result = write!(cursor, "{}", i); debug_assert!(result.is_ok()); // 确保写入成功,实际代码里可以换成错误处理 // 拿到实际写入的字节数 let len = cursor.position() as usize; // 转成&str:这里unsafe是安全的,因为write!输出的都是ASCII字符(属于UTF-8),长度也准确 unsafe { std::str::from_utf8_unchecked(&buffer[..len]) } }
方法二:用itoa crate(首推)
如果允许加第三方依赖,itoa是专门做无堆分配整数转字符串的库,比手动写或者用标准库效率高得多,代码也更简洁:
use itoa::Buffer; fn u64_to_stack_str(i: u64) -> &'static str { let mut buffer = Buffer::new(); buffer.format(i) }
itoa::Buffer内部自带足够大的栈缓冲区,format方法直接返回栈上的&str,连unsafe代码都不用写。
为啥别复制标准库实现?
标准库的Display for u64实现虽然没问题,但代码又长又冗余,还要自己维护。上面两种方法要么复用标准库的成熟逻辑,要么用经过优化的第三方库,省心还不容易出错。
内容的提问来源于stack exchange,提问作者gwy15
相关产品推荐
相关产品推荐

