rust中的静态对象



在嵌入式设置中,我们经常需要声明静态结构体(驱动程序等)它们的内存是已知的,并在编译时分配。在rust中有什么方法可以达到类似的效果吗?例如,我想要有一个驱动程序结构

struct DriverUart{
...
}

和关联的impl块。现在,我想避免有一个名为new()的函数,相反,我想在某个地方先验地分配这个内存(或者有一个可以在外部静态调用的new函数)任何代码块)。在C中,我会简单地把这个结构体的实例化在一些头文件中,它将被静态分配和全局可用。我在铁锈中没有发现类似的东西。如果不可能,那为什么呢?为什么我们能达到类似的效果呢?

谢谢!

现在,我想避免有一个名为new()的函数,相反,我想在某个地方先验地分配这个内存(或者有一个可以在任何代码块之外静态调用的新函数)。在C中,我会简单地把这个结构体的实例化在一些头文件中,它将被静态分配和全局可用。我在铁锈中没有发现类似的东西。如果不可能,那为什么呢?为什么我们能达到类似的效果呢?

https://doc.rust-lang.org/std/keyword.static.html

你可以在Rust中做同样的事情,没有标题,只要所有的元素都是const:

struct DriverUart {
whatever: u32
}
static thing: DriverUart = DriverUart { whatever: 5 };

如果你需要计算非const表达式,那么这显然是行不通的,你需要使用lazy_staticonce_cell之类的东西来实例化类似静态。

当然,由于Rust是一种安全的语言,静态是共享的状态,可变静态如果不通过线程安全的内部可变性容器(例如,原子或Mutex,尽管它们目前是非const的,并且不清楚它们是否会成为其他类型)来缓解,则会非常不安全,静态被认为总是在线程之间共享。

最新更新