2017-09-09 44 views
4

在鏽,看來你基本上可以放在任何東西。性狀,實現塊,函數,靜態變量...將所有內容放在主體中是否存在性能劣勢?

例如,這個編譯:

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編譯器是否優化了任何差異?

回答

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在理論上可以產生不同的代碼(蝴蝶效應)
  • ...
相關問題