是否可以将函数设置为仅在发布版本中内联?

时间:2017-01-06 22:24:53

标签: attributes rust inline conditional-compilation

可能的例子:

#[inline(release)]
fn foo() {
    println!("moo");
}

如果没有,是否可以只包含基于构建类型或其他属性的属性?

1 个答案:

答案 0 :(得分:4)

  

[...]是否可以只包含基于构建类型的属性[...]?

是。这是cfg_attr的用途:

#[cfg_attr(not(debug_assertions), inline(always))]
#[cfg_attr(debug_assertions, inline(never))]
fn foo() {
    println!("moo")
}

这可能是您达到目标的最接近的目标。请注意,编译器可以忽略内联注释(即使使用"始终""从不")。这有很好的理由,你可以在下面阅读。

然而:您想达到什么目标?

人类在内联决策时非常糟糕,而编译器非常聪明。即使没有#[inline],编译器也会在发布模式下内联函数,只要这样做是个好主意。它不会在调试模式中内联。

如果你没有非常好的和特殊的理由来修补自己的内联,你就不应该碰它!编译器几乎在所有情况下都会做正确的事情:)

即使the reference说:

  

编译器根据内部启发式自动内联函数。错误地内联函数实际上可能会使程序变慢,因此应谨慎使用。