rust - 为什么 Rust 同时具有按值调用和按引用调用?

标签 rust calling-convention

有些语言,比如 Haskell,不区分值传递和引用传递。然后,编译器可以通过启发式方法大致选择最有效的调用约定。一个启发式示例是针对 Linux x64 ABI 的:如果参数的大小大于 16 字节,则传递一个指向堆栈的指针,否则传递寄存器中的值。

在 Rust 中同时保留按值传递和按引用传递(当然是不可变的)概念并强制用户选择有什么好处?

如果看到值被修改,传值会不会是传引用+复制的语法糖?

最佳答案

两件事:

  1. Rust 会根据类似的启发式将某些按值传递调用转换为按引用传递。
  2. 按值传递表示所有权转移,而按引用传递表示借用。这些与您所询问的 asm 级问题非常不同,并且完全正交。

换句话说,在 Rust 中,这两种形式具有不同的语义。不过,这并不排除也进行优化。

关于rust - 为什么 Rust 同时具有按值调用和按引用调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36562262/

相关文章:

rust - 为自定义 &[u8] 类型实现 FromStr

xml - sxd-document/sxd-xpath 无法解析 XML

rust - 是否有指定数字功能的任何特征?

C 函数调用的自定义 X86_64 调用约定

c - 与 C 偏移相关的 NASM

c++ - cdecl 调用约定如何破坏 ESP?

rust - 是否可以匹配 `const fn` 的结果?

rust - 如何导入substrate_primitives 以使用sr25519?

c - 使用 objdump 或类似工具显示每个函数的调用约定

C++:通过引用或值传递 Vector 结构?