2015-08-14 64 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