在Rust中,看起来你基本上可以放任何东西.特征,实现块,函数,静态变量…… 例如,这编译: fn main() { trait Foo { fn foo(); } impl Foo for f64 { fn foo() {} } struct MyStruct; enum RustIsCool { MyStruct, }; fn bar
例如,这编译:
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编译器是否优化了差异?
简短的回答:没有什么重要的会有所不同.如果您查看your code on playground的LLVM-IR并将其与code where all of your definitions are outside of main()
进行比较,您会发现在“调试”模式下没有差异(除了命名).在“发布”模式下,根本没有任何差异.
但是,测试代码的位置肯定可能会影响代码生成.但这些都是次要影响.没有什么基础可以影响代码生成(例如,如果main中的定义将隐含引用main的变量).
可能影响代码生成的一些原因:
>由于main()中的定义不能在main()之外使用,因此如果可能的话,这可能是对内联函数调用的强烈提示并删除原始定义.这通常会提高性能.> rustc生成略有不同的LLVM-IR,因此LLVM理论上可以生成不同的代码(蝴蝶效应)> ……