The const
常量存在于程序的整个生命周期。更具体地说,Rust中的常量在内存中没有固定地址。这是因为它们被有效地嵌入到它们使用的每一个地方。由于这个原因,对同一个常量的引用不一定会引用相同的内存地址。
我只在C++中看到过“内联函数”,但从未见过内联常量值。什么是初学者友好的解释这是如何运作?
我也对“内存中没有固定地址”感到困惑。这是否意味着每次我们使用const值时,堆栈上的值只为该表达式分配,并且表达式执行完成后,它将被销毁
发布于 2016-10-20 08:33:48
我只在C++中看到过“内联函数”,但从未见过内联常量值。
在锈蚀中,与const最接近的是C++中的enum。
什么是初学者友好的解释这是如何运作?
简单的初学者的解释是:它只是起作用,不要担心细节的细节。
我也对“内存中没有固定地址”感到困惑。这是否意味着每次我们使用
const值时,堆栈上的一个值只分配给这个表达式,并且表达式执行完毕后,它就会被销毁?
是。也许吧。不是的。
它的意思正是它在锡上说:没有保证是作出的。这使得编译器可以最大限度地优化事情。
好吧,一切都很好,但是.到底发生了什么?
在实践中,有两种情况:
简单是什么意思?那得看情况了。对于每个调用站点,编译器可能决定“足够简单”或“不简单”,这是它接近内联的地方。
这是否意味着每次我们使用
const值时,堆栈上的一个值只分配给这个表达式,并且表达式执行完毕后,它就会被销毁?
它不会被摧毁。const变量不能具有实现Drop的类型。当它不再被使用时,它的价值就会被遗忘。如果它占用了堆栈上的内存,这个内存将在稍后的某个时候被覆盖。
发布于 2016-10-20 08:33:55
锈蚀中的const N: i32 = 5就像C中的#define N 5或与类型安全有关的C++。
当类型匹配时,您可以将其视为文本替换,也就是说,在您的示例中,let foo = 32 + N;等效于let foo = 32 + 5;。
发布于 2016-10-20 07:41:37
constant的行为根本不像一个常规变量;当您定义一个变量时,它甚至没有自己的范围来检查借阅。
比较由以下代码段生成的MIR:
fn main() {
const N: i32 = 5;
}和
fn main() {
let n: i32 = 5;
}您会发现,N扩展到的内容更像是一个函数,而不是变量:
const main::N: i32 = {
let mut _0: i32; // return pointer
bb0: {
_0 = const 5i32; // scope 0 at <anon>:2:20: 2:21
return; // scope 0 at <anon>:2:5: 2:22
}
}当在表达式中使用它时,它的值将被放置在堆栈中,用于该表达式,然后就会被遗忘。
编辑:至少这是在和平级发生的事情。我不是低级别优化的专家,所以实际的结果(不管是否实际使用堆栈内存)必须在LLVM甚至ASM中进行检查。但请注意,这也适用于常规变量。
https://stackoverflow.com/questions/40148175
复制相似问题