Rust 什么';常量、正则不可变变量和静态变量之间的区别是什么?
我正在学习Rust,到目前为止,似乎有3种方法可以声明变量:Rust 什么';常量、正则不可变变量和静态变量之间的区别是什么?,rust,Rust,我正在学习Rust,到目前为止,似乎有3种方法可以声明变量: const A: u8 = 42; static A: u8 = 42; let A: u8 = 42; 我知道你不能有一个可变的const,如果它不是大写的,编译器会警告你,当你使用const时,等价的C预编译器会用一个文本42替换a出现的每个地方(它不会有一个一致的内存地址) 从实践的角度来看,我看不出它们之间有任何不可改变的区别。它们都不能变异。它们都可以完全相同地使用。区别是什么?-const定义值,这些值在相应的代码中被替
const A: u8 = 42;
static A: u8 = 42;
let A: u8 = 42;
我知道你不能有一个可变的const
,如果它不是大写的,编译器会警告你,当你使用const
时,等价的C预编译器会用一个文本42
替换a
出现的每个地方(它不会有一个一致的内存地址)
从实践的角度来看,我看不出它们之间有任何不可改变的区别。它们都不能变异。它们都可以完全相同地使用。区别是什么?-
const
定义值,这些值在相应的代码中被替换-
static
定义表示内存地址的全局变量,即只读内存、全局原子计数器或锁(+初始化)、C-abi交互等-
让
定义作用域变量绑定
您不能将let
用作全局变量(静态生存期),因此static
适合该角色。请注意,它也存在为
-
const
定义值,这些值在相应的代码中被替换-
static
定义表示内存地址的全局变量,即只读内存、全局原子计数器或锁(+初始化)、C-abi交互等-
让
定义作用域变量绑定
您不能将let
用作全局变量(静态生存期),因此static
适合该角色。请注意,它也存在为
有什么区别
这个问题可以很容易地归结为constvs.immutablestatic
,因为这是唯一非常相似的情况(let
旨在将变量引入当前范围)
const
应该在您不介意将值内联到所有位置时使用。通常,这意味着小物体;通常是常数整数。否则将使用不可变的静态
实际上,对于大多数用例(特别是私有项),当考虑由LLVM进行优化时,通常差别不大
如果您想导出一个对象和相关的低级问题,那么您可能需要仔细查看codegen是否特别糟糕
有什么区别
这个问题可以很容易地归结为constvs.immutablestatic
,因为这是唯一非常相似的情况(let
旨在将变量引入当前范围)
const
应该在您不介意将值内联到所有位置时使用。通常,这意味着小物体;通常是常数整数。否则将使用不可变的静态
实际上,对于大多数用例(特别是私有项),当考虑由LLVM进行优化时,通常差别不大
如果您想导出一个对象和相关的低级问题,那么您可能需要仔细查看codegen是否特别糟糕