我正在尝试使用karatsuba技术实现大数字的乘法运算。我陷入了一个我无法绕过的故障。该程序似乎总是在3或4级递归后退出。 sizeof(bint)返回20000.我的bint由一系列短裤组成。
friend bint operator+ (const bint& lhs, const bint& rhs)
{
// adding two big integers
}
bint ksuba(const bint& X, const bint& Y, int n) // n is always a power of 2
{
if (n == 4)
return smul(X, Y); // naive way of multiplying numbers
bint a1, b1, a2, b2;
bint x, y, z;
int half = n/2;
for (int i=0; i<half; i++)
{
a1.data[SIZE - n + i + half] = X.data[SIZE - n + i];
a2.data[SIZE - n + i + half] = X.data[SIZE - n + i + half];
b1.data[SIZE - n + i + half] = Y.data[SIZE - n + i];
b2.data[SIZE - n + i + half] = Y.data[SIZE - n + i + half];
}
a1.idx = SIZE - half;
b1.idx = SIZE - half;
a2.idx = SIZE - half;
b2.idx = SIZE - half;
x = ksuba(a1, b1, half);
y = ksuba(a2, b2, half);
z = ksuba((a1+a2), (b1+b2), n) - x - y;
x.lshift(n);
z.lshift(half);
return x + y + z;
}
使用gdb会出现以下错误 -
Program received signal SIGSEGV, Segmentation fault.
0x00000000004018c2 in bint::ksuba (this=<error reading variable: Cannot access memory at address 0x7fffff7ea3a0>, X=<error reading variable: Cannot access memory at address 0x7fffff7ea398>, Y=<error reading variable: Cannot access memory at address 0x7fffff7ea390>, n=<error reading variable: Cannot access memory at address 0x7fffff7ea38c>) at big.cpp:593
593 bint ksuba(const bint& X, const bint& Y, int n)
我尝试减少我声明的bint变量的数量。具体来说,我通过将xsuba(a2,b2,half)的结果添加到x本身来摆脱y。但它并没有解决问题。有没有办法知道在递归的每一步都分配了多少内存?任何帮助都会非常感激。
答案 0 :(得分:1)
在每个级别,您有7个显式声明的类型为bint的变量,另外2个是为ksuba((a1 + a2),(b1 + b2),n)的调用隐式分配的。所有这些进入堆栈。那是180 KB。如果程序是在调试模式下构建的,则堆栈使用量可能会更大,而不进行优化。
180 KB似乎不足以解释崩溃,因为(假设这是Linux),默认情况下你应该有8 MB的堆栈,你不应该在3或4次迭代后耗尽。但是,正如Dmitri所提到的,你可以尝试使用ulimit工具增加堆栈大小,或者在链接时通过Wl, - stack = xxxxx选项指定它。更好的是,不要把bint放在堆栈上。使用new / delete动态分配它们,并且只在堆栈上保留指针。