首页 > 解决方案 > 如果将结构移动到不同的位置,Rust 中是否有任何特征会收到通知?

问题描述

在用于微控制器的 Rust 和 C 代码的混合中,我有一个 Rust 数据结构,我必须让我的程序的 C 部分知道它。我得到了这个工作。

pub struct SerialPort {
    // ... some attributes ...
}

我尝试重构 Rust 代码,并希望在一个函数中生成 Rust 结构,该函数还注册了我的 C 代码中的回调。

pub fn setup_new_port() -> SerialPort {
    let port = SerialPort::new();
    port.register_with_c_code();
    port
}

这不起作用,因为SerialPort当函数返回时,Rust 会将我的类型变量的内存内容移动到不同的位置。在 C 代码中注册的地址指向(现在已释放的)setup_new_port()堆栈帧,而它被移动到调用者的堆栈帧,因此我的 C 代码将访问无效地址。

是否有任何我可以实现的特征在移动发生时得到通知?我可以在特性的实现中调整我的 C 代码中注册的地址。

我知道我可以通过在堆上分配我的结构来防止移动发生,但我想避免这种情况,因为代码在微控制器上运行并且动态内存分配可能并不总是存在。

标签: rustembeddedmoveffi

解决方案


不,设计使然。

Rust 是专门设计的,没有所谓的移动构造函数,在 Rust 中,移动是按位复制,允许许多优化:

  • 例如使用 Cmemcpyrealloc,
  • panic!基于在移动期间不能调用no 的事实的优化,
  • ...

实际上,C++ 中也有改进这种设计的建议(is_relocatable),性能是主要驱动力。


所以呢?

像做一样Mutex做!也就是说,Box任何不应该移动的东西,并将其隔离在不透明的地方struct,这样任何人都无法将内容移出盒子。

如果堆分配不可用...那么您可能需要查看PinMut或借用该结构。借来的东西不能搬。


推荐阅读