2017-07-12 74 views
2

有時我想在原始雙打中添加更多的類型安全。一個想法很多,會增加單位信息與類型。例如,在C#中,包裝原始值的結構是否爲零成本抽象?

struct AngleRadians { 
    public readonly double Value; 
    /* Constructor, casting operator to AngleDegrees, etc omitted for brevity... */ 
} 

在類似上面的情況下,僅存在一個單一的場,將在JIT能夠優化掉這種抽象在所有情況下?與使用未包裝的double類似的代碼相比,哪些情況(如果有的話)會導致額外生成的機器指令?

提及任何過早的優化將被downvoted。我有興趣瞭解基本事實。

編輯: 要縮小問題的範圍,這裏有幾個特別感興趣的情景......

// 1. Is the value-copy constructor zero cost? 
// Is... 
var angleRadians = new AngleRadians(myDouble); 
// The same as... 
var myDouble2 = myDouble; 

// 2. Is field access zero cost? 
// Is... 
var myDouble2 = angleRadians.Value; 
// The same as... 
var myDouble2 = myDouble; 

// 3. Is function passing zero cost? 
// Is calling... 
static void DoNaught(AngleRadians angle){} 
// The same as... 
static void DoNaught(double angle){} 
// (disregarding inlining reducing this to a noop 

這些都是一些我能想到的把我的頭頂部的東西。當然,像@EricLippert這樣出色的語言設計師可能會想到更多的場景。因此,即使這些典型的用例是零成本的,我仍然認爲知道是否有任何情況下JIT不會將一個結構保存爲一個值,並將展開後的值作爲等價物,而不列出每個可能的代碼段,因爲它自身的問題

+3

你爲什麼不嘗試做一些測試? –

+8

如果你想知道兩匹馬中的哪一匹馬速度更快,你會問網上的陌生人,還是你比賽馬匹?你想知道擬議計劃的成本,然後**運行程序**,很快你就會知道它的成本! –

+6

撇開性能的問題,我建議有類型'AngleDegrees','AngleRadians','AngleGradians'等是一個壞主意。有一個'Angle'類型,它具有屬性'AsDegrees','AsRadians'等等,工廠'FromRadians'等等。你的類型的實現細節只是:實現細節。通過將實現細節嵌入到類型的名稱中,可以限制您的創新能力並降低抽象級別。 –

回答

0

我沒有發現顯著的性能差異在調試模式下運行DoNaught的十億試驗與優化開啓。有時候,雙贏,有時包裝贏了。

相關問題