在Rust中,看起来你基本上可以放任何东西。特征,实现块,函数,静态变量......
例如,这会编译:
fn main() {
trait Foo {
fn foo();
}
impl Foo for f64 {
fn foo() {}
}
struct MyStruct;
enum RustIsCool {
MyStruct,
};
fn bar() {
trait Baz {
fn baz();
}
impl Baz for f64 {
fn baz() {}
}
}
static x: f64 = 10.0;
println!("This compiles!");
}
如您所见,您甚至可以将这些内容嵌套在其他块中。
显然,从风格的角度来看这样做很糟糕;它很丑陋,难以重构,并且使代码重用更加困难。
但我很好奇:这样做会有性能开销吗?或者Rust编译器能否优化差异?
答案 0 :(得分:7)
简短回答:没有什么重大意义。
如果您查看your code on playground的LLVM-IR并将其与code where all of your definitions are outside of main()
进行比较,您会发现“调试”模式下没有差异(除了命名)。在“发布”模式下,根本没有任何差异。
但是,测试代码的位置肯定可能会影响代码生成。但这些都是次要影响。没有什么基础可以影响代码生成(例如main
中的定义是否会隐含引用main
的变量)。
可能影响代码生成的一些原因:
main()
中的定义不能在main()
之外使用,因此如果可能的话,这可能是对内联函数调用的强烈提示并删除原始定义。这通常会提高性能。rustc
生成略有不同的LLVM-IR,因此LLVM理论上可以生成不同的代码(蝴蝶效应)