使用此表达式时:
mem::size_of::() * 8
像这样:
value % (mem::size_of::() * 8); value * (mem::size_of:: () * 8);
编译器是否能够优化它:
value & ((mem::size_of::() * 8) - 1); value >> LOG2_OF_EXPRESION;
有没有相当于C++的东西constexpr
所以我可以从函数中返回它并在需要编译时表达式的地方使用它?
mem::size_of
现在声明为const
fn,这意味着它可以保证能够在编译时进行评估.您可以在const上下文中使用它:
use std::mem; const BYTES: usize = mem::size_of::(); fn main() {}
确切知道的唯一方法是查看LLVM IR或汇编.允许随着时间的推移而改变,所以如果它非常重要,你需要自己跟踪它.
从Rust 1.14开始,这段代码:
#![crate_type="lib"] use std::mem; pub fn use_it() -> usize { mem::size_of::() * 8 }
在调试模式下编译时生成此LLVM IR :
; Function Attrs: norecurse nounwind readnone uwtable define i64 @_ZN10playground6use_it17h005e773511657405E() unnamed_addr #0 { entry-block: ret i64 192 }
正如您所看到的,调用size_of
已成为常量值192
.然后,Rust和/或LLVM可以执行他们想要的任何正常优化.
我相信可以安全地假设此函数始终是编译时常量.
有没有相当于C++的东西
constexpr
从C++中看到constexpr的等价物?
还没.RFC 911引入了能够在编译时进行评估的const
函数和函数.诀窍在于,实际上为它应该使用的所有内容启用它很困难,并且在编译器的一些内部重写上是预测的.
在夜间Rust中,您可以执行以下操作:
#![feature(const_fn)] const fn adder(a: usize, b: usize) -> usize { a + b } const BITS: usize = adder(1, 2); fn main() { println!("{}", BITS); }