Rust 如何返回大类型(优化前)?

fad*_*bee 3 function-call rust

具有函数签名,例如:

pub fn hash(input: &[u8]) -> [u8; 32]
Run Code Online (Sandbox Code Playgroud)

这 32 个字节如何传递给调用函数?(在优化之前,可能会将某些部分放入寄存器中。)

可能性包括:

  • 在堆栈上,调用函数必须将它们复制到其自己的堆栈帧中预先分配的空间中。
  • 在堆上,将生成的free()插入到调用函数中。
  • 有些是按线程静态分配的缓冲区。

只是好奇,我不需要这些信息。答案可能因架构而异。

Cha*_*man 5

既不涉及副本也不涉及堆分配。

调用者函数为其堆栈上的值分配空间。被调用者需要一个额外的隐藏参数,即返回值的地址。它将值写在那里。调用者将其堆栈上分配的空间的地址作为隐藏参数的值传递。

当然,这一切都无法保证。这就是它现在的运作方式。

  • FWIW,当返回大于 128b(MS 调用约定中为 64b)的结构时,调用者为返回值分配空间是 x64 调用约定的一部分,因此虽然不能保证该语言会将其用于非 FFI 函数,或者它将直接在该空间中构造返回值,这是一个很好的假设:该语言需要充分的理由来费心与标准系统 ABI 不同和偏离。 (2认同)
  • 此外,调用者不会传递堆栈上已分配空间的地址,而是将其作为第一个参数寄存器 (RDI) 传递,从而移位其他所有内容。在 SystemV 和 MS 约定中,被调用者还必须返回通过 RAX 获得的指针。 (2认同)