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不會將一個結構保存爲一個值,並將展開後的值作爲等價物,而不列出每個可能的代碼段,因爲它自身的問題
你爲什麼不嘗試做一些測試? –
如果你想知道兩匹馬中的哪一匹馬速度更快,你會問網上的陌生人,還是你比賽馬匹?你想知道擬議計劃的成本,然後**運行程序**,很快你就會知道它的成本! –
撇開性能的問題,我建議有類型'AngleDegrees','AngleRadians','AngleGradians'等是一個壞主意。有一個'Angle'類型,它具有屬性'AsDegrees','AsRadians'等等,工廠'FromRadians'等等。你的類型的實現細節只是:實現細節。通過將實現細節嵌入到類型的名稱中,可以限制您的創新能力並降低抽象級別。 –