gpt4 book ai didi

rust - 'mem::size_of' 是否在编译时评估?

转载 作者:行者123 更新时间:2023-11-29 07:57:37 24 4
gpt4 key购买 nike

当使用这个表达式时:

mem::size_of::<T>() * 8

像这样:

value % (mem::size_of::<T>() * 8);
value * (mem::size_of::<T>() * 8);

编译器能否将其优化为:

value & ((mem::size_of::<T>() * 8) - 1);
value >> LOG2_OF_EXPRESION;

是否有与 C++ 的 constexpr 等效的东西,以便我可以从函数返回它并在需要编译时表达式的地方使用它?

最佳答案

自 Rust 1.22.0 起

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

use std::mem;

const BYTES: usize = mem::size_of::<f64>();

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::<String>() * 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 能够进行他们想要的任何正常优化。

我相信可以安全地假设这个 函数将始终是一个编译时常量。

Is there something equivalent to C++'s constexpr

参见 Equivalent of constexpr from C++?

还没有。 RFC 911引入了 const 函数,可以在编译时计算的函数。诀窍在于,实际上为它应该使用的所有东西启用它是困难的,并且取决于编译器的一些内部重写。

在 nightly Rust 中,您可以执行以下操作:

#![feature(const_fn)]

const fn adder(a: usize, b: usize) -> usize {
a + b
}

const BITS: usize = adder(1, 2);

fn main() {
println!("{}", BITS);
}

关于rust - 'mem::size_of' 是否在编译时评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41306546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com