C++中有这段代码:
#include <iostream>
struct Foo {
int * ptr;
public:
Foo() {
ptr = new int;
std::cout << "Foo constructor" << std::endl;
}
~Foo() {
delete ptr;
std::cout << "Foo destructor" << std::endl;
}
};
auto foo = Foo();
int main() {
std::cout << "Hello" << std::endl;
return 0;
}
它编译和运行没有任何问题。其中,在调用 main 之前,会创建一个对象,分配内存。但是如果你在 Rust 中做这样的事情,编译器不会让你这样做:
pub static foo: Foo = Foo::new("Hello".to_string());
他不喜欢to_string()
分配内存的功能。为什么 Rust 是这样设计的?什么是安全的(Rust 被定位为安全的系统编程语言)?
这是因为 Rust 中的静态表达式在 C++ 术语中是 constexpr,constexpr 表达式也禁止内存分配。
这里的原因与其说是安全,不如说是出于“不买不买”的原则。如果在初始化静态变量时允许任意函数,那么其中一个可以创建一个新线程,该线程可以在初始化之前访问另一个静态变量。因此,每个变量都需要一个互斥锁(这就是在 C++ 中的实现方式!),即使在单线程程序中,多线程也会产生大量开销。