对于内联的Rust中的const类型是什么意思?

Cha*_*dan 6 const inline rust

我是Rust和系统编程的绝对初学者.constRust 的文档说明了这一点:

常量适用于程序的整个生命周期.更具体地说,Rust中的常量在内存中没有固定地址.这是因为它们有效地内联到他们使用的每个地方.由于这个原因,对同一常量的引用不一定保证指代相同的存储器地址.

我只是const在C++中遇到过,但从来没有内联const类型.有人可以提供一个初学者友好的解释,如何工作?

另外,我有点困惑const.这是否意味着每次我们使用该const类型时,堆栈中的值仅为此表达式分配,并且在表达式执行完毕后,它将被销毁

Mat*_* M. 8

我只是遇到了C++中的内联函数,但从未使用内联const类型.

const在Rust中,最接近于a 的是enumC++中的.

有人可以提供一个初学者友好的解释,如何工作?

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

另外,我对内存中没有固定地址感到困惑.这是否意味着每次我们使用const类型时,堆栈中的值仅为此表达式分配,并且在表达式执行完毕后,它将被销毁?

是.也许.没有.

这完全意味着它在锡上所说的内容:无法保证.这使编译器可以最大限度地自由地优化事物.


好吧,这一切都很好,但是......真的发生了什么?

在实践中,有两种情况:

  • 这个值很简单:它甚至不会触及堆栈,而是直接在程序集中进行硬编码.例如,这很可能发生在积分中.
  • 值不是那么简单:它是在只读存储器中创建的,并从那里引用/复制.堆栈上的多个副本显然会有不同的地址.

什么是简单的意思?这得看情况.对于每个调用站点,编译器可以决定"是否足够简单",这是接近内联的位置.

这是否意味着每次我们使用const类型时,堆栈中的值仅为此表达式分配,并且在表达式执行完毕后,它将被销毁?

它不会被摧毁.const变量不能具有实现的类型const.当它不再被使用时,该值就被遗忘了.如果曾经占用了堆栈中的内存,有时候这个内存会被覆盖.

  • @PavelStrakhov:C++中的`enum`值是一个没有内存地址的命名值(如果你有`enum {X};`那么`&X`会引发编译时错误),枚举的值是内联的在每个使用地点.它比`#define`更接近,因为它只计算一次(并且它也更清晰:尊重范围等等). (2认同)
  • 您听起来好像编译器可能会决定将其转换为“静态”以避免复制,但情况真的如此吗?我似乎无法让编译器做到这一点;它总是产生等同于内联表达式的代码,即使它显然是次优的。 (2认同)
  • @Veedrac:我在操场上检查了一些变化,确实rustc在IR中发出内联定义.当然,在Release中,LLVM只是对它进行常数折叠,你最终会在寄存器中直接得到整数. (2认同)

WiS*_*GaN 5

const N: i32 = 5在 Rust 中就像#define N 5在 C 或 C++ 中完成类型安全。

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