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

在Rust中创建CString是否比CStr的内存开销更高?

Rust中C绑定传*const c_char:CString vs CStr的效率对比

是的,CString::new()确实会产生CStr可以避免的内存分配,两者的差异源于各自的设计逻辑:

1. CStr的无分配特性

当你使用CStr::from_bytes_with_nul(b"hello\0")时,这个操作完全不会分配新内存。它只是将自带null终止符的静态字节数组,包装成CStr引用——本质是对原静态数据的只读视图,没有任何复制或堆内存申请。

需要注意:必须保证输入的字节数组末尾有且仅有一个\0,否则from_bytes_with_nul会返回错误。对于编译期确定的字符串字面量,直接写b"hello\0"是安全可靠的。

2. CString::new()的内存分配逻辑

CString::new("hello")会在堆上分配新内存:它会把输入的Rust字符串(本身不带null终止符)复制到堆内存中,再手动添加末尾的\0以满足C字符串格式要求。这种分配是额外的——原字符串字面量已经存在于静态存储区,但CString必须创建带null结尾的副本。

你的示例场景最优选择

你示例中传递的是静态字符串"hello",显然用CStr的写法更高效,完全没有内存开销。如果是动态生成的字符串(比如运行时读取的用户输入),CStr就不适用了——你没法确保动态字符串天然带有正确的null终止符,这时CString是更安全的选择,它会帮你处理null终止逻辑,避免手动操作出错。

另外,对于静态字符串,还可以用更简洁的c宏(需引入use std::ffi::c;):

use std::ffi::{c, c_char};

extern "C" fn foo(string: *const c_char) {
    // 不修改字符串的逻辑
}

fn main() {
    unsafe { foo(c"hello\0".as_ptr()) }
}

额外注意

不管用哪种方式,都要确保C函数不会持有*const c_char指针超过Rust变量的生命周期——你的示例中arg的生命周期覆盖了foo的调用过程,是安全的。

内容的提问来源于stack exchange,提问作者Ivan Raul Sanchez Diaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:47:07