我是机械工程专业的研究生。我的研究小组有一个用C ++编写的内部有限元代码。我注意到向量和数组的大量内存是静态分配的,例如:
在Element.h中
// A vector to store a finite element residual vector in h file
static Real* sRe
在Element.C
中if ( ! sIsResAndJacAllocated )
{
UInt numElemDofs = this->GetNumDofs();
// Residual storage
sReXt = new Real[numElemDofs*numElemDofs];
sIsResAndJacAllocated = true;
}
以这种方式,向量仅为第一个到达此函数的元素分配一次,其余对象只是重复使用该内存空间。
开始开发代码的第一个人比C ++知道更多的C,这就是为什么很多都是用这种方式编写的。
在组中静态分配这些向量和数组的想法是,只需一次分配这些大块内存并重复使用它就会更快;相比于每个有限元或每次调用函数时必须多次分配相同的数组(例如使用alloca)。这是真的?真的有很大的速度差异吗?
我们正试图得出结论,以便决定是否应该保留静态内存分配或摆脱它。我几个星期以来一直在寻找答案,没有运气。我希望你的意见有助于得出结论。
感谢。
埃尔南
答案 0 :(得分:1)
首先,当使用"静态"时,这会让C ++开发人员认为你的意思是一个带有"静态"的变量。宣言。您的示例不是静态声明数组;它是通过" new"在堆中创建的。运营商。我不知道这些数组有多大,但是创建存储一次(静态地,就像你所说的那样),这可能是一个好主意。当然,它取决于每次调用函数时都需要创建/销毁这些数组的次数(您的替代方案)。当然,在堆上不断创建/销毁对象会有更多的开销。这是否是一个性能问题很难说,因为我们不知道你的程序还有什么用。如果它花费90%的时间进行其他处理(文件i / o,大量计算等),那么这种内存分配可能不是一个重要的因素。不知道操作系统,编译器选项等,您可以始终以两种方式对其进行编码并运行性能基准测试。