首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在铁锈中的恒定值被内联意味着什么?

问在铁锈中的恒定值被内联意味着什么?
EN

Stack Overflow用户
提问于 2016-10-20 07:34:09
回答 3查看 1.7K关注 0票数 7

The const

常量存在于程序的整个生命周期。更具体地说,Rust中的常量在内存中没有固定地址。这是因为它们被有效地嵌入到它们使用的每一个地方。由于这个原因,对同一个常量的引用不一定会引用相同的内存地址。

我只在C++中看到过“内联函数”,但从未见过内联常量值。什么是初学者友好的解释这是如何运作?

我也对“内存中没有固定地址”感到困惑。这是否意味着每次我们使用const值时,堆栈上的值只为该表达式分配,并且表达式执行完成后,它将被销毁

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-20 08:33:48

我只在C++中看到过“内联函数”,但从未见过内联常量值。

在锈蚀中,与const最接近的是C++中的enum。

什么是初学者友好的解释这是如何运作?

简单的初学者的解释是:它只是起作用,不要担心细节的细节。

我也对“内存中没有固定地址”感到困惑。这是否意味着每次我们使用const值时,堆栈上的一个值只分配给这个表达式,并且表达式执行完毕后,它就会被销毁?

是。也许吧。不是的。

它的意思正是它在锡上说:没有保证是作出的。这使得编译器可以最大限度地优化事情。

好吧,一切都很好,但是.到底发生了什么?

在实践中,有两种情况:

  • 该值非常简单:它甚至不触及堆栈,而是直接在程序集中进行硬编码。例如,这很可能发生在整数上。
  • 这个值并没有那么简单:它是在只读内存中创建的,并且是从那里引用/复制的。堆栈上的多个副本将有不同的地址。

简单是什么意思?那得看情况了。对于每个调用站点,编译器可能决定“足够简单”或“不简单”,这是它接近内联的地方。

这是否意味着每次我们使用const值时,堆栈上的一个值只分配给这个表达式,并且表达式执行完毕后,它就会被销毁?

它不会被摧毁。const变量不能具有实现Drop的类型。当它不再被使用时,它的价值就会被遗忘。如果它占用了堆栈上的内存,这个内存将在稍后的某个时候被覆盖。

票数 8
EN

Stack Overflow用户

发布于 2016-10-20 08:33:55

锈蚀中的const N: i32 = 5就像C中的#define N 5或与类型安全有关的C++。

当类型匹配时,您可以将其视为文本替换,也就是说,在您的示例中,let foo = 32 + N;等效于let foo = 32 + 5;。

票数 5
EN

Stack Overflow用户

发布于 2016-10-20 07:41:37

constant的行为根本不像一个常规变量;当您定义一个变量时,它甚至没有自己的范围来检查借阅。

比较由以下代码段生成的MIR:

代码语言:javascript
复制
fn main() {
    const N: i32 = 5;
}

和

代码语言:javascript
复制
fn main() {
    let n: i32 = 5;
}

您会发现,N扩展到的内容更像是一个函数,而不是变量:

代码语言:javascript
复制
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中进行检查。但请注意,这也适用于常规变量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40148175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档