当前位置:  开发笔记 > 后端 > 正文

在编译时评估'mem :: size_of'吗?

如何解决《在编译时评估'mem::size_of'吗?》经验,为你挑选了1个好方法。

使用此表达式时:

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所以我可以从函数中返回它并在需要编译时表达式的地方使用它?



1> Shepmaster..:

截至Rust 1.22.0

mem::size_of现在声明为constfn,这意味着它可以保证能够在编译时进行评估.您可以在const上下文中使用它:

use std::mem;

const BYTES: usize = mem::size_of::();

fn main() {}

在Rust 1.22.0之前

确切知道的唯一方法是查看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);
}

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有