0

私は機械工学の大学院生です。私の研究グループには、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;
}

このように、ベクトルはこの関数に到達する最初の要素に対して 1 回だけ割り当てられ、残りのオブジェクトはそのメモリ空間を繰り返し使用します。

コードの開発を始めた最初の人は、C++ よりも C をよく知っていたので、多くのコードがこのように書かれています。

これらのベクトルと配列をグループに静的に割り当てる背後にある考え方は、これらの大きなメモリを一度だけ割り当てて繰り返し使用する方が高速であるということです。有限要素ごとに、または関数が呼び出されるたびに同じ配列を複数回割り当てる必要があるのと比較して (たとえば alloca を使用)。これは本当ですか?本当に速度に大きな違いがあるのですか?

静的メモリ割り当てを維持するか、それを取り除くかを決定するために、これについて結論に達しようとしています。私はこれに対する答えを数週間探していましたが、運がありませんでした。あなたの意見が結論に達するのに役立つことを願っています。

ありがとう。

ヘルナン

4

1 に答える 1

1

まず、「静的に」という言葉を使用すると、C++ 開発者は、「静的」宣言を持つ変数を意味すると混乱するでしょう。あなたの例は、配列を静的に宣言していません。「new」演算子を介してヒープに作成されています。これらの配列の大きさはわかりませんが、ストレージを一度作成すると(静的に、あなたが呼ぶように)、おそらく良い考えです。もちろん、関数が呼び出されるたびにこれらの配列を作成/破棄する必要がある回数に依存します(代替手段)。確かに、ヒープ上でオブジェクトを継続的に作成/破棄すると、より多くのオーバーヘッドが発生します。あなたのプログラムが他に何をしているのか分からないので、これがパフォーマンスの問題であるかどうかはわかりません。時間の 90% を他の処理 (ファイル I/O、大量の計算など) に費やしている場合、おそらく、このメモリ割り当ては、いずれにしても大きな要因ではないでしょう。OS やコンパイラ オプションなどを知らなくても、いつでも両方の方法でコーディングして、パフォーマンス ベンチマークを実行できます。

于 2013-01-19T22:49:52.823 に答える