gpt4 book ai didi

c++ - 存储递归函数的堆栈有多大。我应该考虑操作系统、编译器和硬件等哪些因素

转载 作者:行者123 更新时间:2023-11-28 01:17:26 27 4
gpt4 key购买 nike

您好,我正在运行一个递归代码,我在我的个人计算机上意识到,运行默认的 Visual Studio 调试器时,在出现堆栈溢出错误之前,在使用不带调试选项的运行时,我只能适应 6776 次。当使用调试器时,我能够得到它到 6781。在 cpp.sh 上我能够得到太多 9 亿。我怀疑缓存,但它仍然不能解释一切。因为它比 onlinegdb 准确得多,仅达到 205000。我的计算机的能力明显低于 cpp.sh 使用的服务器,但不低于 132,723 倍。使用了哪些软件和硬件技巧以及如何使其保持一致?

我正在使用配备 4GB 内存的英特尔 N3350 运行 Windows 10 版本 1903。 enter image description here

int main()

{
long double Answer = 0;
Answer = 3 + (Solver(2, 1, UserInput, 0));
}
double Solver(int counter, int group, int stop, long double partialanswer)
{
long double Counter = counter;
if (Counter >= stop)
{
return partialanswer;
}
if (group % 2 != 0)
{
partialanswer = partialanswer + (4 / ((Counter) * (Counter + 1) * (Counter + 2)));
}
else
{
partialanswer = partialanswer - (4 / ((Counter) * (Counter + 1) * (Counter + 2)));
}
Solver((counter + 2), (group+1), stop, partialanswer);
}

注意 3 如果您需要,这里有完整的代码。

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
double Solver(int counter, int group, int stop, long double partialanswer)
{
long double Counter = counter;
if (Counter >= stop)
{
return partialanswer;
}
//partialanswer = round(partialanswer * pow(2, 54)) / pow(2, 54);
if (group % 2 != 0)
{
partialanswer = partialanswer + (4 / ((Counter) * (Counter + 1) * (Counter + 2)));
}
else
{
partialanswer = partialanswer - (4 / ((Counter) * (Counter + 1) * (Counter + 2)));
}
Solver((counter + 2), (group+1), stop, partialanswer);
}

int main()

{
int UserInput;
long double Answer = 0;
cin >> UserInput;
Answer = 3 + (Solver(2, 1, UserInput, 0));
cout << "PI = " << setprecision(18) << Answer << endl;
cout << "reference Pi is equal to 3.1415926535897932384626433832795028841971 " << endl;
cout << " The Difference is equal to " <<fixed << setprecision(30) << abs(Answer - 3.1415926535897932384626433832795028841971) << endl;
}

减法代码

#include <iostream>
#include <iomanip>
using namespace std;


int main()
{
long double UserInput1;
long double UserInput2;
cin >> UserInput1;
cin >> UserInput2;
cout << fixed << setprecision(32) << (UserInput1 - UserInput2);
}

cached 900,000,000 entry

cached 100,000,000 entry

subtraction code and run

[崩溃前缓存 100000000][6]

cached 900000000 after crash cached 100000000 after crash

cached Subtraction 60 digit code and run

---- /image/j0QN2.png

最佳答案

在 Windows 中,一个典型的 thread stack size 1Mb (工具链之间可能有所不同——GCC、VC++ 等,但数量级不同)。要更改堆栈大小,请参阅您的工具链的文档。

每个调用都会消耗一个堆栈帧,其大小将由其局部变量和参数的大小加上返回地址的大小和数据对齐填充的占位决定。

如果您的堆栈为 1Mb 并且您达到了 6776 的深度,这表明每次调用可能需要 154 个字节,这似乎有点高 - 我无法从所提供的代码中说明那么多。调试版本可能会填充堆栈帧以支持溢出检测。即便如此,我估计可能有 60 个字节,所以仍然很重要。 9 亿的深度可能需要 50Gb 的堆栈,这似乎令人难以置信。

在调试器中,您可以观察 SP 寄存器,了解当您输入 Solver() 时它发生了多少变化。然而,通过运行可调试代码,您也可能会禁用优化,这可能是您在在线系统上获得更高性能的真正答案。

关于c++ - 存储递归函数的堆栈有多大。我应该考虑操作系统、编译器和硬件等哪些因素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58192992/

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