我弄不明白为什么这段铁 rust 代码会导致堆栈溢出.

enum SlidingAttackTable {
    Rook([[u64; 4096]; 64]),
    Bishop([[u64; 512]; 64]),
}

fn init_all() -> (SlidingAttackTable, SlidingAttackTable, [u64; 64], [u64; 64], [usize; 64]) {
    return (SlidingAttackTable::Bishop([[0; 512]; 64]), SlidingAttackTable::Rook([[0; 4096]; 64]), [0; 64], [0; 64], [0; 64]);
}

fn main() {
    println!("start");
    let (bishop_attack_table, rook_attack_table, bishop_masks, bishop_magic_numbers, bishop_relevant_bits) = init_all();
}

我试着注释掉除println!("start")之外的所有内容,结果打印出"Start",没有任何错误.不知何故,当我只添加这几行代码时,它甚至在到达该行并打印"Start"之前就崩溃了.这里没有我可以检测到的循环或递归,所以我不知道如何开始诊断这个问题.

推荐答案

[u64; 4096]占用2^(3+12)字节.这是2^15字节. [[u64; 4096]; 64]占用64倍的内存(即2^21字节或2MB).您似乎已达到堆栈大小限制.

您可以增加堆栈大小限制,但这可能不是一个好主意.总体而言,您不应该try 在堆栈上保留太多数据.请改用堆.有多种方法可以做到这一点.如果您使用的是vector,那么堆栈上将只保留一个指针,而数据本身将位于堆上.

Rust相关问答推荐

无法将记录器向下转换回原始 struct

当T不执行Copy时,如何返回Arc Mutex T后面的值?

在使用AWS SDK for Rust时,如何使用硬编码访问密钥ID和密钥凭据?

我如何制作一个变异迭代器来锁定内部数据直到删除?

如何将映射反序列化为具有与键匹配的字段的定制 struct 的向量?

如何初始化选项<;T>;数组Rust 了?

Rust 中什么时候可以返回函数生成的字符串切片&str?

找不到 .has_func 或 .get_func 的 def

是否可以在不直接重复的情况下为许多特定类型实现一个函数?

如何重命名 clap_derive 中的子命令占位符?

Nom 解析器无法消耗无效输入

更新 rust ndarray 中矩阵的一行

闭包返回类型的生命周期规范

一旦令牌作为文字使用,声明宏不匹配硬编码值?

Rust 中的自动取消引用是如何工作的?

简单 TCP 服务器的连接由对等重置错误,mio 负载较小

将 Futures 的生命周期特征绑定到 fn 参数

如何创建递归borrow 其父/创建者的 struct ?

更好的方法来模式匹配带有 Rust 的窥视孔装配说明窗口?

在 Traits 函数中设置生命周期的问题