gpt4 book ai didi

macos - Mac OS X 上 Rust 的递归深度太浅

转载 作者:行者123 更新时间:2023-11-29 08:34:43 25 4
gpt4 key购买 nike

fn recu(n: int) {
println!("{}", n);
recu(n+1)
}

fn main() {
recu(0)
}

输出:

...
2924
2925
2926
2927
2928
2929
2930
2931

thread '<main>' has overflowed its stack
[1] 23873 illegal hardware instruction ./test

信息:

rustc 1.0.0-nightly (ea6f65c5f 2015-01-06 19:47:08 +0000)

MacBook Pro

2.2 GHz Intel Core i7

在其他机器上(Linux 64):

11668
11669
11670

thread '<main>' has overflowed its stack
[1] 18070 illegal hardware instruction (core dumped) ./test

最佳答案

请注意 11670/2931 几乎正好等于 4 - 也就是说,Linux 上的堆栈帧数几乎是 OS X 上的四倍。显然,您的 Mac OS X 的默认堆栈大小是您的 1/4 Linux。这与 Rust 无关,等效的 C 程序会产生大致相同的结果。您可以从命令行运行 ulimit -s 以确认操作系统之间的堆栈大小差异。

然而,LLVM 应该能够尾调用优化这个特定的程序。尝试使用 -O 标志运行 rustc。如果这可行,这将允许无限递归。 LLVM 将生成一个 recu 函数,该函数不会调用自身,而是会在设置 n 后循环回到它自己的开始,从而允许它在不消耗堆栈空间的情况下进行递归。

在我自己的测试中,我必须将程序修改为这样才能让它永远递归,可能是因为 println! 宏隐藏了析构函数:

fn recu(n: int) {
printint(n);
recu(n+1)
}

#[inline(never)]
fn printint(n: int) {
println!("{}", n);
}

fn main() {
recu(0)
}

关于macos - Mac OS X 上 Rust 的递归深度太浅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27854721/

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