Rust中的< - 符号是什么?

时间:2018-04-10 20:03:40

标签: syntax rust operators placement-new

Rust中的<-运算符/表达式是什么?您可以找到the symbol here

我正好在查看描述Rust中表达式和操作的页面。我没有在Rust中编程,所以我问了一个朋友,他是生锈的,这个符号是什么,但即使他不知道它是什么。

1 个答案:

答案 0 :(得分:12)

<-运算符不是稳定Rust的一部分。至少还没有。

有一个RFC建议使用<-语法将新对象直接写入内存中的特定位置,作为another RFC的替代方案,提出in。这是(当前不稳定的)box语法的一般化,它允许您直接分配给堆,而无需临时堆栈分配。

目前,在没有使用unsafe代码的情况下,没有办法实现这一点,并且通常您需要先在堆栈上进行分配。在this RFC中讨论了潜在问题,这是相关RFC链中的第一个,并给出了背景动机,但关键原因是:

  • 使用希望将对象写入特定内存地址的硬件。您现在可以在Rust中不安全地执行此操作,但如果SDK可以为此提供安全且高性能的API,则会更好。
  • 直接写入堆的预分配部分更快,而不是每次都分配新内存。
  • 为新对象分配内存时,直接在堆上执行此操作会更快,而不是首先在堆栈上分配然后克隆或移动。

在C ++中,有一个名为&#34; placement new&#34;的功能,它通过让你向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中可能看起来像这样// 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";

b"bar"

我不希望这个完全代码按原样编译,即使实现了放置功能。但请注意,Rust目前无法执行最后一行尝试的操作:直接在缓冲区的开头分配unsafe,而不先在堆栈上进行分配。在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]; 代码也无法帮助您。您仍然必须首先在堆栈上进行分配,然后将其克隆到缓冲区:

box

box语法也不会对此有所帮助。这将分配新的堆内存,然后您仍然必须将数据复制到缓冲区。

对于在堆上分配新对象时避免临时堆栈分配的简单情况,<-语法将在稳定时解决。 Rust将来需要解决更复杂的案例,但尚不确定lapply(x, function(xi) xi[!sapply(xi, function(xii) all(xii==""))]) 是否会出现语法。