我需要一个只读的全局数组,一开始我想用的是LazyLock<[i32; HUGE_SIZE]>,但是
static ARRAY: LazyLock<[i32; HUGE_SIZE]> = LazyLock::new(|| {
let mut arr = [0; HUGE_SIZE];
for (i, elem) in arr.iter_mut().enumerate() {
*elem = i as i32;
}
arr
});
类似这样的代码会爆栈,或许我应该使用LazyLock<Box<[i32; HUGE_SIZE]>>? 或者说LazyLock里面再包一层指针才是合理的用法?
1
共 2 条评论, 1 页
评论区
写评论因为
LazyLock
是调用闭包函数,先在栈上分配并初始化,然后再移动到目标位置的(LazyLock
/Box
)。所以改成LazyLock<Box<[i32; HUGE_SIZE]>>
是正确的,并且,需要先在堆上分配空间后,再初始化:或者是用上位老哥说的第三方库
pinned_init
替你做以上的初始化大数组的全局变量要套一层Box,不然就算可以通过编译,生成的可执行文件也会很大,初始化方面推荐用原地初始化的的pinned_init库。