相关疑难解决方法(0)

如何在Rust 1.0中的堆上分配数组?

已经有一个问题,但与Rust 0.13有关,语法似乎已经改变.从当前文档中我了解到在堆上创建数组将是这样的:

fn main() {
    const SIZE: usize = 1024 * 1024;
    Box::new([10.0; SIZE]);
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行这个程序时,我收到以下错误:

thread '<main>' has overflowed its stack
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

arrays heap rust

12
推荐指数
3
解决办法
2695
查看次数

在 Rust 堆上创建固定大小的数组

我尝试使用以下代码:

fn main() {
    let array = box [1, 2, 3];
}
Run Code Online (Sandbox Code Playgroud)

,在我的程序中,它会导致编译错误:error: obsolete syntax: ~[T] is no longer a type

AFAIU,Rust 中没有动态大小的数组(大小必须在编译时知道)。然而,在我的代码片段中,数组确实具有静态大小,并且应该是类型~[T, ..3](拥有大小为 3 的静态数组),而编译器说它具有类型~[T]。是否有任何深层原因导致无法在堆上分配静态大小的数组?

PS 是的,我听说过Vec

rust

9
推荐指数
2
解决办法
2万
查看次数

将数组分配到堆上,其大小在运行时已知

在C++中,我可以将1000个数组int放到堆上,如下所示:

int size = 1000;
int* values = new int[size];
delete[] values;
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何在Rust中执行等效操作.

let size = 1000;
let values = Box::new([0; size]) // error: non-constant path in constant expression
Run Code Online (Sandbox Code Playgroud)

根据我的理解,Rust强制在编译时知道所有数组的大小,并且在创建数组时不允许使用表达式.

arrays heap rust

6
推荐指数
1
解决办法
3770
查看次数

如何在Rust中运行时分配数组?

一旦我分配了阵列,我该如何手动释放它?指针算法在不安全模式下是否可行?

就像在C++中一样:

double *A=new double[1000];
double *p=A;
int i;
for(i=0; i<1000; i++)
{
     *p=(double)i;
      p++;
}
delete[] A;
Run Code Online (Sandbox Code Playgroud)

Rust中有任何等效的代码吗?

memory allocation dynamic rust

4
推荐指数
2
解决办法
5751
查看次数

有没有办法直接在堆上分配标准的Rust数组,完全跳过堆栈?

Stack Overflow上已经有几个[i32]关于在堆上分配数组(比如说)的问题.一般建议是拳击,例如Box<[i32]>.但是虽然拳击对于较小的阵列工作得很好,但问题是被装箱的阵列必须首先在堆栈上分配.

因此,如果数组太大(比如1000万个元素),你会 - 甚至用拳击 - 得到一个堆栈溢出(一个不太可能有一个大的堆栈).

然后建议使用Vec<T>,这是Vec<i32>在我们的例子中.虽然这确实起到了作用,但确实会对性能产生影响.

考虑以下程序:

fn main() {
    const LENGTH: usize = 10_000;
    let mut a: [i32; LENGTH] = [0; LENGTH];
    for j in 0..LENGTH {
        for i in 0..LENGTH {
            a[i] = j as i32;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

time告诉我这个程序运行大约需要2.9秒.我在这个例子中使用10'000,所以我可以在堆栈上分配它,但我真的想要一个1000万.

现在考虑相同的程序,但Vec<T>改为:

fn main() {
    const LENGTH: usize = 10_000;
    let mut a: Vec<i32> = vec![0; LENGTH];
    for j in 0..LENGTH {
        for i in 0..LENGTH …
Run Code Online (Sandbox Code Playgroud)

arrays heap rust

4
推荐指数
1
解决办法
714
查看次数

使用 Box 分配大型数组时,线程“&lt;main&gt;”溢出了堆栈

我正在实施Comsort。我想在堆栈上创建固定大小的数组,但它显示stack overflow. 当我将其更改为位于堆上时(Rust by Example 表示要在我们必须使用的堆中分配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; …
Run Code Online (Sandbox Code Playgroud)

heap-memory dynamic-memory-allocation rust

2
推荐指数
2
解决办法
2529
查看次数