是否可以将函数设置为仅在发布构建期间内联?
Is it possible to set a function to only be inlined during a release build?
可能的例子:
#[inline(release)]
fn foo() {
println!("moo");
}
如果不是,是否可以仅包含基于构建类型或其他属性的属性?
[...] is it possible to only include an attribute based on build type [...]?
是的。这就是 cfg_attr
的用途:
#[cfg_attr(not(debug_assertions), inline(always))]
#[cfg_attr(debug_assertions, inline(never))]
fn foo() {
println!("moo")
}
这可能是您离目标最近的一次。请注意,编译器可以忽略内联注释(即使使用 "always" 和 "never")。这是有充分理由的,您可以在下面阅读。
但是:你想达到什么目的?
人类在内联决策方面相当糟糕,而编译器却非常聪明。即使没有 #[inline]
,编译器也会在发布模式下内联函数,只要这样做是个好主意。而且它不会在调试模式下内联。
如果您没有很好和特殊的理由自己修改内联,您不应该碰它!编译器几乎在所有情况下都会做正确的事情:)
甚至 the reference 说:
The compiler automatically inlines functions based on internal heuristics. Incorrectly inlining functions can actually make the program slower, so it should be used with care.
可能的例子:
#[inline(release)]
fn foo() {
println!("moo");
}
如果不是,是否可以仅包含基于构建类型或其他属性的属性?
[...] is it possible to only include an attribute based on build type [...]?
是的。这就是 cfg_attr
的用途:
#[cfg_attr(not(debug_assertions), inline(always))]
#[cfg_attr(debug_assertions, inline(never))]
fn foo() {
println!("moo")
}
这可能是您离目标最近的一次。请注意,编译器可以忽略内联注释(即使使用 "always" 和 "never")。这是有充分理由的,您可以在下面阅读。
但是:你想达到什么目的?
人类在内联决策方面相当糟糕,而编译器却非常聪明。即使没有 #[inline]
,编译器也会在发布模式下内联函数,只要这样做是个好主意。而且它不会在调试模式下内联。
如果您没有很好和特殊的理由自己修改内联,您不应该碰它!编译器几乎在所有情况下都会做正确的事情:)
甚至 the reference 说:
The compiler automatically inlines functions based on internal heuristics. Incorrectly inlining functions can actually make the program slower, so it should be used with care.