这个
<-
操作员是
不
部分稳定锈蚀。至少现在还没有。
有一个
RFC
其中提出的语法包括
<-
用于将新对象直接写入内存中的特定位置,作为
another RFC
,建议
in
。这是(当前不稳定)的概括
box
语法,它允许您直接分配给堆,而无需临时的堆栈分配。
目前,没有一种方法可以不使用
unsafe
通常,您需要首先在堆栈上进行分配。有一个关于潜在问题的讨论
this RFC
这是一系列相关RFC中的第一个,提供了背景动机,但关键原因是:
-
使用期望将对象写入特定内存地址的硬件。现在可以在Rust中不安全地执行此操作,但如果SDK可以为此提供一个安全且性能良好的API就更好了。
-
直接写入堆的预分配部分比每次分配新内存更快。
-
当为一个新对象分配内存时,直接在堆上这样做会更快,而不是先在堆栈上分配内存,然后克隆或移动。
在C++中,有一个称为“placement new”的特性,它通过允许您向
new
,它是要开始写入的现有指针。例如:
// For comparison, a "normal new", allocating on the heap
string *foo = new string("foo");
// Allocate a buffer
char *buffer = new char[100];
// Allocate a new string starting at the beginning of the buffer
string *bar = new (buffer) string("bar");
据我所知,上面的C++示例在Rust with中可能看起来像这样
<-
:
// Memory allocated on heap (with temporary stack allocation in the process)
let foo = Box::new(*b"foo");
// Or, without the stack allocation, when box syntax stabilises:
let foo = box *b"foo";
// Allocate a buffer
let mut buffer = box [0u8; 100];
// Allocate a new bytestring starting at the beginning of the buffer
let bar = buffer[0..3] <- b"bar";
我没想到会这样
准确的
要按原样编译的代码,即使实现了放置功能。但请注意,在Rust中,目前不可能执行最后一行的操作
尝试
待办事项:分配
b"bar"
直接在缓冲区的开头,而不首先在堆栈上进行分配。在《铁锈》(Rust)杂志上,现在根本没有办法做到这一点。即使
不安全的
代码在这里帮不了你。您仍然需要首先在堆栈上进行分配,然后将其克隆到缓冲区:
// Note that b"bar" is allocated first on the stack before being copied
// into the buffer
buffer[0..3].clone_from_slice(&b"bar"[0..3]);
let bar = &buffer[0..3];
和
盒
语法在这里也没有帮助。这将分配新的堆内存,然后仍然需要将数据复制到缓冲区。
对于在堆上分配新对象时避免临时堆栈分配的简单情况
盒
当它稳定下来时,语法会解决这个问题。Rust需要在将来的某个时候解决更复杂的问题,但目前还不能确定
<-
是将出现的语法。