gpt4 book ai didi

rust - 使用 Box 分配大型数组时,线程 '
' 已溢出其堆栈

转载 作者:行者123 更新时间:2023-11-29 08:33:23 24 4
gpt4 key购买 nike

我正在实现 combsort .我想在堆栈上创建固定大小的数组,但它显示堆栈溢出。当我将它更改为在堆上时(Rust by Example 说 to allocate in the heap we must use Box ),它仍然显示 stack overflow

fn new_gap(gap: usize) -> usize {
let ngap = ((gap as f64) / 1.3) as usize;
if ngap == 9 || ngap == 10 {
return 11;
}
if ngap < 1 {
return 1;
}
return ngap;
}

fn comb_sort(a: &mut Box<[f64]>) {
// previously: [f64]
let xlen = a.len();
let mut gap = xlen;
let mut swapped: bool;
let mut temp: f64;
loop {
swapped = false;
gap = new_gap(gap);
for i in 0..(xlen - gap) {
if a[i] > a[i + gap] {
swapped = true;
temp = a[i];
a[i] = a[i + gap];
a[i + gap] = temp;
}
}
if !(gap > 1 || swapped) {
break;
}
}
}

const N: usize = 10000000;

fn main() {
let mut arr: Box<[f64]> = Box::new([0.0; N]); // previously: [f64; N] = [0.0; N];
for z in 0..(N) {
arr[z] = (N - z) as f64;
}
comb_sort(&mut arr);
for z in 1..(N) {
if arr[z] < arr[z - 1] {
print!("!")
}
}
}

输出:

thread '<main>' has overflowed its stack
Illegal instruction (core dumped)

或者

thread 'main' has overflowed its stack
fatal runtime error: stack overflow

我知道我的stack size不够用,和C++在函数内部创建非堆数组的时候一样太大了,但是这段代码是用了heap但是还是显示stack overflow。这段代码到底有什么问题?

最佳答案

据我所知,代码似乎仍在尝试先在堆栈上分配数组,然后再将其移入框中。

如果我切换到 Vec<f64>,它对我有用代替 Box<[f64]>像这样:

fn new_gap(gap: usize) -> usize {
let ngap = ((gap as f64) / 1.3) as usize;
if ngap == 9 || ngap == 10 {
return 11;
}
if ngap < 1 {
return 1;
}
return ngap;
}

fn comb_sort(a: &mut [f64]) {
// previously: [f64]
let xlen = a.len();
let mut gap = xlen;
let mut swapped: bool;
let mut temp: f64;
loop {
swapped = false;
gap = new_gap(gap);
for i in 0..(xlen - gap) {
if a[i] > a[i + gap] {
swapped = true;
temp = a[i];
a[i] = a[i + gap];
a[i + gap] = temp;
}
}
if !(gap > 1 || swapped) {
break;
}
}
}

const N: usize = 10000000;

fn main() {
let mut arr: Vec<f64> = std::iter::repeat(0.0).take(N).collect();
//let mut arr: Box<[f64]> = Box::new([0.0; N]); // previously: [f64; N] = [0.0; N];
for z in 0..(N) {
arr[z] = (N - z) as f64;
}
comb_sort(arr.as_mut_slice());
for z in 1..(N) {
if arr[z] < arr[z - 1] {
print!("!")
}
}
}

关于rust - 使用 Box 分配大型数组时,线程 '<main>' 已溢出其堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40953585/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com