You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 00:27:20