我正在使用C中的大型数组进行数值计算。
在其中一个函数中,我使用了一些临时的本地(一次性)数组。通常,我只会将这些声明为double v[N]
,然后不必担心必须手动释放内存。
我注意到的问题是,当我的N变得非常大(大于400万)时,我的程序无法声明变量。因此,我求助于malloc()
和free()
,这使我能够成功地运行程序。问题是,当我使用动态分配(对于较小的N)时,我的执行时间几乎翻了一番,从24秒增加到40秒。
我可以修改代码以避免首先创建这些临时数组,但这会影响代码的可读性和编码工作。我目前正在使用一个预处理器宏来访问向量,就像2D矩阵一样。有没有其他解决方案可以避免CPU成本,同时允许我像矩阵一样保存数据?
当您声明方法的局部变量时,您正在使用堆栈上的自动分配变量,不幸的是,堆栈大小受到限制。使用malloc
意味着变量将在堆上分配,时间差就是您为动态分配支付的费用。
我看到了两种可能的解决方案:
- 使用
static
全局数组(并在必要时重用它),以便编译器能够优化对它的访问 - 更改堆栈大小,这样您就不会在函数本地使用更大的数组时遇到问题,这甚至可以动态完成,请查看此处