代码之家  ›  专栏  ›  技术社区  ›  FredMan

Rust中的<-符号是什么?

  •  9
  • FredMan  · 技术社区  · 6 年前

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

    我碰巧在看一个描述Rust中表达式和操作的页面。我不在Rust中编程,所以我问一个支持Rust的朋友这个符号是什么,但即使他也不知道它是什么。

    1 回复  |  直到 5 年前
        1
  •  13
  •   Peter Hall    6 年前

    这个 <- 操作员是 部分稳定锈蚀。至少现在还没有。

    有一个 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需要在将来的某个时候解决更复杂的问题,但目前还不能确定 <- 是将出现的语法。

    推荐文章