面试题答案
一键面试-
通过
const
关键字定义静态值: 在Rust中,使用const
关键字定义静态值的语法如下:const MY_CONST: i32 = 42;
这里定义了一个名为
MY_CONST
的const
值,类型为i32
,值为42。const
值的类型必须在编译时已知,并且其值必须是常量表达式。 -
const
定义的静态值与static
定义的静态变量在编译时优化中的不同:- 内存分配:
const
:const
值在编译时会被内联到使用它的地方。它们不会在运行时占用额外的内存,因为编译器在编译阶段就将其值直接替换到使用处。例如:const MY_CONST: i32 = 42; fn main() { let x = MY_CONST; // 编译时,MY_CONST的值42直接被替换到x的初始化处,不会为MY_CONST单独分配内存 }
static
:static
变量在程序的整个生命周期内都存在,它们有自己固定的内存地址。static
变量在程序启动时被分配内存,并且在程序结束时才释放。例如:static MY_STATIC: i32 = 42; fn main() { let x = &MY_STATIC; // MY_STATIC有自己独立的内存地址,x是指向这个地址的引用 }
- 可变性:
const
:const
值是绝对不可变的。一旦定义,其值在任何情况下都不能改变。这是因为它在编译时就被确定并内联到代码中。static
:虽然static
变量默认是不可变的,但可以通过mut
关键字使其可变。不过,可变的static
变量在多线程环境下使用需要特别小心,因为它们需要使用Sync
和Send
等线程安全相关的特性来确保线程安全。例如:static mut MY_MUTABLE_STATIC: i32 = 0; fn main() { unsafe { MY_MUTABLE_STATIC = 42; } }
- 类型限制:
const
:const
值的类型必须是Copy
类型,并且必须在编译时完全确定。这意味着它们不能包含动态大小类型(DST),例如str
(必须使用&'static str
)。static
:static
变量可以具有任何类型,包括动态大小类型。例如,可以定义static MY_STR: &'static str = "Hello, world!";
,这里&'static str
是一种动态大小类型,但可以用于static
变量。
- 内存分配: