0

我是机械工程专业的研究生。我的研究小组有一个用 C++ 编写的内部有限元代码。我注意到向量和数组的大量内存是静态分配的,例如:

在元素.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)分配相同的数组相比。这是真的?速度差别真的很大吗?

我们正试图就此得出结论,以决定是否应该保留静态内存分配或摆脱它。几个星期以来,我一直在寻找这个问题的答案,但没有运气。希望您的意见有助于得出结论。

谢谢。

埃尔南

4

1 回答 1

1

首先,当使用“静态”这个词时,这会让 C++ 开发人员误以为您是指带有“静态”声明的变量。您的示例不是静态声明数组;它是通过“new”运算符在堆中创建的。我不知道这些数组有多大,但是创建一次存储(静态的,正如你所说的那样),这可能是个好主意。当然,这取决于每次调用函数时必须创建/销毁这些数组多少次(您的替代方案)。当然,在堆上不断创建/销毁对象会产生更多开销。这是否是性能问题很难说,因为我们不知道您的程序还做了什么。如果它花费 90% 的时间做其他处理(文件 i/o、大量计算等),那么也许这种内存分配不会成为一个重要因素。在不了解操作系统、编译器选项等的情况下,您始终可以双向编码并运行性能基准测试。

于 2013-01-19T22:49:52.823 回答