Rust 中的 <- 符号是什么?
What is the <- symbol in Rust?
Rust 中的 <-
operator/expression 是什么?你可以找到 the symbol here.
我碰巧在看一个描述 Rust 中的表达式和操作的页面。我不会用 Rust 编程,所以我问了一个亲 Rust 的朋友这个符号是什么,但他也不知道它是什么。
<-
运算符 不是 稳定版 Rust 的一部分。至少现在还没有。
有一个RFC which proposes syntax involving <-
for writing new objects directly to specific places in memory, as an alternative to another RFC,提议in
。这是(当前不稳定的)box
语法的概括,它允许您直接分配到堆,而无需临时堆栈分配。
目前,如果不使用 unsafe
代码就无法做到这一点,而且您通常需要先在堆栈上进行分配。 this RFC 中对潜在问题进行了讨论,这是相关 RFC 链中的第一个,并给出了背景动机,但关键原因是:
- 使用希望将对象写入特定内存地址的硬件。您现在可以在 Rust 中不安全地执行此操作,但如果 SDK 可以为此提供安全且高效的 API 会更好。
- 直接写入堆的 pre-allocated 部分比每次都分配新内存更快。
- 为新对象分配内存时,直接在堆上分配内存比先在堆栈上分配然后克隆或移动要快。
在 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 中可能看起来像这样 <-
:
// 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";
我不希望这个 准确 代码编译 as-is,即使实现了放置功能。但是请注意,在 Rust 中,目前不可能执行最后一行 尝试 要做的事情:直接在缓冲区的开头分配 b"bar"
,而不是先在堆栈上分配.目前在 Rust 中,还没有办法做到这一点。即使 unsafe
代码在这里也帮不了你。您仍然必须先在堆栈上分配,然后将其克隆到缓冲区:
// 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 在未来的某个时候需要解决更复杂的情况,但目前还不确定 <-
是会出现的语法。
Rust 中的 <-
operator/expression 是什么?你可以找到 the symbol here.
我碰巧在看一个描述 Rust 中的表达式和操作的页面。我不会用 Rust 编程,所以我问了一个亲 Rust 的朋友这个符号是什么,但他也不知道它是什么。
<-
运算符 不是 稳定版 Rust 的一部分。至少现在还没有。
有一个RFC which proposes syntax involving <-
for writing new objects directly to specific places in memory, as an alternative to another RFC,提议in
。这是(当前不稳定的)box
语法的概括,它允许您直接分配到堆,而无需临时堆栈分配。
目前,如果不使用 unsafe
代码就无法做到这一点,而且您通常需要先在堆栈上进行分配。 this RFC 中对潜在问题进行了讨论,这是相关 RFC 链中的第一个,并给出了背景动机,但关键原因是:
- 使用希望将对象写入特定内存地址的硬件。您现在可以在 Rust 中不安全地执行此操作,但如果 SDK 可以为此提供安全且高效的 API 会更好。
- 直接写入堆的 pre-allocated 部分比每次都分配新内存更快。
- 为新对象分配内存时,直接在堆上分配内存比先在堆栈上分配然后克隆或移动要快。
在 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 中可能看起来像这样 <-
:
// 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";
我不希望这个 准确 代码编译 as-is,即使实现了放置功能。但是请注意,在 Rust 中,目前不可能执行最后一行 尝试 要做的事情:直接在缓冲区的开头分配 b"bar"
,而不是先在堆栈上分配.目前在 Rust 中,还没有办法做到这一点。即使 unsafe
代码在这里也帮不了你。您仍然必须先在堆栈上分配,然后将其克隆到缓冲区:
// 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 在未来的某个时候需要解决更复杂的情况,但目前还不确定 <-
是会出现的语法。