2015-08-14 51 views
6

我正在寫一個應用程序中創建大型陣列的Arc對象:我應該如何有效地初始化`Arc <[u8; 65536]>`?

use std::sync::Arc 

let buffer: Arc<[u8; 65536]> = Arc::new([0u8; 65536]); 

剖析此代碼後,我發現一個memmove發生,使這種緩慢。通過對的其他調用,編譯器似乎非常聰明,可以在沒有memmove的情況下初始化存儲的數據。

不管你信不信,上面的代碼快於:

use std::sync::Arc; 
use std::mem; 

let buffer: Arc<[u8; 65536]> = Arc::new(unsafe {mem::uninitialized}) 

這是一個有點意外的。

見解歡迎,我希望這是一個編譯器問題。

回答

4

是的,現在,你不得不依靠優化,顯然,在這種情況下它並沒有這樣做。我不知道爲什麼。

我們還在研究如何安置新功能,這些功能可以讓您明確地告訴編譯器您想直接在堆上初始化它。請參閱https://github.com/rust-lang/rfcs/pull/809(和https://github.com/rust-lang/rfcs/pull/1228,其中提出了對此問題無關緊要的更改)。一旦實施,這應該工作:

let buffer: Arc<_> = box [0u8; 65536]; 
+0

值得注意的是你提到的RFC已經被合併到[MIR(中級中間表示)RFC(https://github.com/rust- lang/rfcs/pull/1211),這是[2016年的工作重點](http://blog.rust-lang.org/2015/08/14/Next-year.html)。 FYI :) –

+0

謝謝!這不是一個巨大的阻力,我會等待這個優化。如果它能用於「未初始化」 – Greg