具有函数签名,例如:

pub fn hash(input: &[u8]) -> [u8; 32]

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

可能的情况包括:

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

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

推荐答案

既不涉及副本,也不涉及堆分配.

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

当然,这一切都不能保证.这就是现在碰巧发生的事情.

Rust相关问答推荐

在actix—web中使用Redirect或NamedFile响应

如何导出 rust 色二进制文件中的符号

铁 rust 干线无法使用PowerShell获取环境变量

Box::new()会从一个堆栈复制到另一个堆吗?

习语选项<;T>;到选项<;U>;当T->;U用From定义

在什么情况下 `..._or()` 比 `..._or_else(|| {})` 更好,为什么?

Rust proc_macro 和 syn:解析空格

为什么`tokio::main`可以直接使用而不需要任何导入?

Rust中如何实现一个与Sized相反的负特性(Unsized)

当在lambda中通过引用传递时,为什么会出现终身/类型不匹配错误?

Rust 中的 Option as_ref 和 as_deref 有什么不同

如何从 rust 中的同一父目录导入文件

borrow 匹配手臂内部的可变

在异步 Rust 中,Future 如何确保它只调用最近的 Waker?

在 Rust 中,将可变引用传递给函数的机制是什么?

SDL2 没有在终端键上触发?

在 FFI 的上下文中,未初始化是什么意思?

Abortable:悬而未决的期货?

有没有办法在 Rust 中对 BigInt 进行正确的位移?

为什么 Rust 中的关联类型需要明确的生命周期注释?