2016-05-24 27 views
4

這些方法使用動態調度(接收的性狀對象&Debug作爲參數):爲什麼一些std :: fmt :: Debug *方法使用動態分派?

種這些方法使用靜態調度和被寫入相關entry方法方面:

爲什麼方法的第一個列表使用動態分配的,而不是靜態調度?如果使用靜態調度,它們的使用會受到限制嗎?

回答

5

靜態調度使用monomorphization,這會導致爲每個具體類型創建代碼的單獨副本。

如果您有使用許多具體類型的功能,你可能會招致在編譯時創建並優化所有這些版本的大損失。即使在這些情況下單態化不會增加性能,也會發生這種情況。

取而代之,您可以選擇使用trait object,這會創建一個代碼實現(對於&Trait)。


這些方法添加的RFC 640一部分,但discussion似乎並沒有提到這方面。實際上,他們是originally implemented with static dispatch。只有到後來,他們changed to accept a trait object

重組調試建設者,以儘量減少代碼生成

從通用範圍切換到特質的對象,並具有非內聯 內方法應該減少調試impls的大小,因爲我們關心 關於一個Debug實現方式的速度不如二進制膨脹。

相關問題