将所有内容放在主体中是否存在性能劣势?

问题描述:

在锈,看来你基本上可以放在任何东西。性状,实现块,函数,静态变量...将所有内容放在主体中是否存在性能劣势?

例如,这个编译:

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在理论上可以产生不同的代码(蝴蝶效应)
  • ...