2

これは良い習慣ですか?{または、関数と関数の間のコード ブロックを置き換える必要が}ありますか? 再利用できる可能性があります(認めます)が、これを行う唯一の動機は、割り当てられたメモリを解放できるように巨大colsumで必要ないため、割り当てを解除することです。

 vector<double> C;
 {
  vector<double> colsum;
  A.col_sum(colsum);
  C = At*colsum;
 }
 doSomething(C);
4

5 に答える 5

13

私の本では、括弧を使用して自動変数のスコープを設定することは問題ありませんが、一般的に、同じ関数内で特に何度も括弧を使用している場合は、関数があまりにも多くの異なることを行っている可能性があり、分割する必要があります。

于 2010-07-14T17:23:01.520 に答える
5

ベクトルのデータは常に動的に割り当てられます。ブックキーピング データのみがスタックに格納されます。そうでない場合でも、スタック メモリの割り当ては基本的に自由です。スタックからの割り当て解除は、ほとんどのアーキテクチャでレジスタの値を変更するだけです。

編集

動的な割り当て解除に関しては、ある時点 (特に関数の最後) で割り当てを解除する必要があります。メモリを割り当てたままにしておくことで、実際には何も失うことはありません。さらに割り当てる必要があり、十分ではありません。実際に問題が発生する前に、その割り当て解除が発生する正確なタイミングを気にする必要がありますか?

/編集

しかし、ポイントは何ですか?最適化については時期尚早に考えているようです。

コードをリファクタリングする場合は、パフォーマンスではなく、わかりやすくするために行ってください。

于 2010-07-14T17:23:47.770 に答える
3

他の人が指摘したように、ベクトルメモリはスタックに割り当てられていません。そのメモリを早い段階で解放したい場合、一般的なイディオムは次のとおりです。

vector<double> C;
vector<double> colsum;
A.col_sum(colsum);
C = At*colsum;
    std::vector<double>().swap(colsum);
doSomething(C);

これにより、一時的なベクターが作成され、コンテンツが大きなベクターと交換されます。命令の最後に、テンポラリが破棄され、メモリが解放されます。空のベクトルが残ります。

colsum.resize(0)andは利用可能なメモリを解放する必要がないことに注意してくださいcolsum.clear()。多くの場合、ベクトルが以前にそのサイズに成長した場合、再びそれを行う可能性があると想定しません。

于 2010-07-14T17:36:02.313 に答える
3

Vector はメモリをスタックに格納しません。そこに格納されるのはベクター オブジェクト自体だけで、それほど大きくはありません。このようにスコープすると、割り当てられたメモリを解放する破棄が強制されます。

また、実装がサブスコープ変数をスタックからポップする必要があることが ISO で指定されているかどうかもわかりません。

于 2010-07-14T17:29:11.330 に答える
0

内部コードを別の場所で再利用する場合は、関数に分割します。内部コードが (ループ内のように) 頻繁に呼び出される場合は、ベクトルがループ内で絶えず作成および破棄されないように、おそらくリファクタリングする必要があります。そうでなければ、あなたが提案したことをするのは悪い習慣だとは思いません。

于 2010-07-14T22:54:15.280 に答える