2

次の形式の C++ プログラムがあります。

int main(){
    int answer;

    ...

    MEMORY_CONSUMING_DATA_ARRAY temp;
    a few operations on the above;
    answer=result of these operations;

    ... //More code
}

つまり、独自の機能を保証していないように見えるコードの小さなブロックがありますが、大量のメモリを使用しています。

メモリを消費する変数 (クラス) を限られたスコープ内に存在させて結果を生成し、それを破棄したいと考えています。ヘルパー関数でこれを簡単に行うことができますが、私が作業しているシナリオではやり過ぎのようです。

これを達成する方法について何か考えはありますか?

ありがとう!

4

2 に答える 2

14

破壊が必要な場合:

int main() {
    int answer;

    ...
    { // << added braces
      MEMORY_CONSUMING_DATA_ARRAY temp;
      a few operations on the above;
      answer=result of these operations;
    }
    ... //More code
}

などの動的割り当てによってサポートされるコレクション/オブジェクトで機能しstd::vectorます。

しかし、大きなスタック割り当ての場合...コンパイラに翻弄されます。コンパイラは、関数が戻った後にスタックをクリーンアップするのが最善であると判断するか、関数内で段階的にクリーンアップを実行する場合があります。私がクリーンアップと言うとき、私はあなたの関数が必要とするスタック割り当てを指しています - 破壊ではありません。

これを拡張するには:

動的割り当ての破棄:

int main() {
    int answer;
    ...
    { // << added braces
      std::vector<char> temp(BigNumber);
      a few operations on the above;
      answer=result of these operations;
      // temp's destructor is called, and the allocation
      // required for its elements returned
    }
    ... //More code
}

対スタック割り当て:

int main() {
    int answer;
    ...
    {
      char temp[BigNumber];
      a few operations on the above;
      answer=result of these operations;
    }

    // whether the region used by `temp` is reused
    // before the function returns is not specified
    // by the language. it may or may not, depending
    // on the compiler, targeted architecture or
    // optimization level.

    ... //More code
}
于 2012-05-08T18:35:31.150 に答える
3

ジャスティンの答えは問題ありませんが、この操作を何度も実行している場合は、このメモリを再利用することをお勧めします。

編集

指摘されているように、 static はメモリをスタックに割り当てないようにするため、メリットがある場合があります。また、毎回同じ量をコピーして読み取りを行わない場合、毎回メモリをゼロにする必要がある場合はオプションになります。この時点を過ぎると、zeromemory またはその他の初期化呼び出しへの呼び出しを保存できます。

int main(){
    int answer;

    ...

    {
      static MEMORY_CONSUMING_DATA_ARRAY temp; // make this static or a member perhaps
      temp = 0; // initialise it every time to clear the memory or zeromemory or other op
      a few operations on the above;
      answer=result of these operations;
    }
    ... //More code
}
于 2012-05-08T18:40:02.180 に答える