rust - 如果将结构移动到不同的位置,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 代码中注册的地址。
我知道我可以通过在堆上分配我的结构来防止移动发生,但我想避免这种情况,因为代码在微控制器上运行并且动态内存分配可能并不总是存在。
解决方案
不,设计使然。
Rust 是专门设计的,没有所谓的移动构造函数,在 Rust 中,移动是按位复制,允许许多优化:
- 例如使用 C
memcpy
和realloc
, panic!
基于在移动期间不能调用no 的事实的优化,- ...
实际上,C++ 中也有改进这种设计的建议(is_relocatable
),性能是主要驱动力。
所以呢?
像做一样Mutex
做!也就是说,Box
任何不应该移动的东西,并将其隔离在不透明的地方struct
,这样任何人都无法将内容移出盒子。
如果堆分配不可用...那么您可能需要查看PinMut
或借用该结构。借来的东西不能搬。
推荐阅读
- python - 在具有相同父 Widget 的不同类中执行方法
- ios - AsyncDisplayKit 问题在 Swift 中同时播放多个视频
- flutter - google chorme 上的错误 ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY
- python - 如何将浮点数舍入到一定数量的小数位Python
- python - 在 Python 中使用 next() 搜索对象非常慢
- html - 设置宽度时 div 下的额外空白(白色)空间:100vh
- python - 如何在表中循环以发送值
- json - 为什么我的 POST 请求不会更新我的 data.json 文件?
- html - Vue JS - Checkbox / if Checked do This if unchecked do that
- python - 尝试将 SCN_MODIFIED 与 pyqt6 一起使用会产生 TypeError 崩溃