我正在编写一个创建大型数组的 Arc
对象的应用程序:
use std::sync::Arc
let buffer: Arc<[u8; 65536]> = Arc::new([0u8; 65536]);
分析此代码后,我发现正在发生 memmove
,这使它变慢了。对于 Arc::new
的其他调用,编译器似乎足够聪明,无需 memmove
即可初始化存储的数据。
信不信由你,上面的代码比:
use std::sync::Arc;
use std::mem;
let buffer: Arc<[u8; 65536]> = Arc::new(unsafe {mem::uninitialized})
这有点令人惊讶。
欢迎提供见解,我认为这是一个编译器问题。
最佳答案
是的,现在,您必须依靠优化,显然,在这种情况下并没有这样做。我不确定为什么。
我们还在研究放置新功能,这将能够让您明确地告诉编译器您想要直接在堆上初始化它。参见 https://github.com/rust-lang/rfcs/pull/809 (和 https://github.com/rust-lang/rfcs/pull/1228 提出的更改对于这个问题无关紧要)。一旦实现,这应该有效:
let buffer: Arc<_> = box [0u8; 65536];
关于performance - 我应该如何有效地初始化 `Arc<[u8; 65536]>`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32016187/