0

何百万回も呼び出す必要がある関数があるとしましょう。この関数によって実行される算術演算はそれほど重くはないため、重要なのはすべての変数がどれだけ速く割り当てられるかだけです。また、変数は常にスタックに割り当てられると仮定します。最も単純なケースの例:

void doSomething(){
    int aReallyLargeVariable[10000];
    ...performing a few light operations on that variable and returning nothing...
}

関数がすべての変数を返すと、変数が破棄されることを知っているので、
この変数を静的またはグローバルにしてキャッシュする方がよいのではないでしょうか? それを最適化する最良の方法は何ですか?

4

3 に答える 3

3

パフォーマンスの問題を引き起こすのは割り当てではありません。問題はそれを初期化することです

    int aReallyLargeVariable[10000];

それほど時間はかかりません

    int aReallyLargeVariable[10000] = {0};

しましょう。また、巨大なオブジェクトを動的に作成すると、問題が発生する可能性があります。

ロジックがそれほど重くなく、プリミティブ型のみを使用する関数がある場合は、それを次のように定義するだけで、inlineパフォーマンスについて心配する必要はありません。

大量のオブジェクトを定義する必要がある場合は、stackまたはvector1000以上の要素を持つ必要のない別のデータ構造について考えてください

于 2016-05-06T09:49:11.727 に答える
1

この関数を最適化するには、何度も呼び出されることを考慮して、最初のステップはdo not declare the large variable locally. これを行うと、いくつかのことが起こります。

  • 配列をローカルで宣言し、おそらく少数の値しか使用しないため、多くのスタック スペースが無駄になります。
  • この宣言によって引き起こされるスタック操作 (プッシュ/ポップ) は、おそらく関数が実行しなければならない実際の作業を上回ります。

この配列を別の場所で宣言し (必要に応じてグローバルに宣言する)、配列へのポインターを渡す方がよいでしょう。このようにして、再割り当てに時間を無駄にすることなく、メモリを再利用することもできます。

于 2016-05-06T10:00:28.367 に答える
0

int aReallyLargeVariable[10000];関数が呼び出されるたびにこの膨大な量のメモリを割り当ておよび割り当て解除することで、全体がスタックに負担をかけないように、それらを静的として割り当てることをお勧めし ます。ただし、 をグローバルとして宣言することもできますがint aReallyLargeVariable[10000]; 、多くの開発者はコード内で多くのグローバル変数を使用することを嫌います。関数内の静的変数が (同時実行などのために) 気に入らず、グローバル変数も気に入らない場合は、グローバル スコープで変数を static として宣言して、変数名がコンテキストでのみ有効になるようにすることができます。リンカーエラーを防ぐことができる宣言の。

ソース.cpp

static int aReallyLargeVariable[10000];
void myFunction()
{
    aReallyLargeVariable[1] = 10;
}

オブジェクト.cpp

int aReallyLargeVariable[10000];  /* No name collisions during linking */

注: Source.cppObject.cppに含めることを決定しない限り、またはその逆の場合にのみ機能します。

于 2018-05-26T18:44:36.897 に答える