3

関数で使用されるすべての一時ベクトルに対して1つのベクトルクラスメンバーを使用することのメモリ管理サイトからの違いは何ですか:

class A
{
   private:
   vector<Type> m_vector;
}

void fnc()
{
   m_vector.clear();
   m_vector.push_back();
   //further operations on vector
}

関数内で一時ベクトルを作成します。

void fnc()
{
    vector<Type> vector;
    //further operations on vector
}

最初のオプションではメモリの断片化が少なくなると思います。これは、1 つの割り当てを行ってこの領域を使用しているためです。2 番目のケースでは、メモリの断片化をもたらすさまざまな関数のベクトルにメモリを割り当てています。

このベクトルの使用法の長所と短所は何ですか? 関数に多くのベクトルが必要なクラスがある場合、どちらを使用すればよいですか? そして、メモリ管理サイトから見た方が良いのはどれですか?

4

3 に答える 3

9

断片化と割り当て/割り当て解除が少ないため、メモリ管理の観点からはソリューションの方が優れている可能性がありますが、次のようになります。

  • マルチスレッド環境ではスレッド セーフが低下します。ベクトルの使用に関する各メソッドで同期を実装する必要がある場合があります。
  • 各メソッドでベクトルの内容をクリアすることを忘れないでください
于 2012-06-04T11:40:11.913 に答える
6

簡単なルール:
クラスオブジェクトの存続期間までベクトルを存在させたい場合は、それをクラスメンバーにします。そうでない場合はそうしません。

つまり、その有効期間がオブジェクトの有効期間に関連付けられている場合は、メンバーとして使用する必要があります。
そうでない場合、必要なのはローカル ベクトルだけです。
最初のアプローチと 2 番目のアプローチのどちらが使用に適しているかは、マイクロ最適化です。

于 2012-06-04T11:34:41.143 に答える
1

再利用のためだけにメンバーベクトルを作成しないでください。何かがメンバーであるかどうかは、クラスのロジックに基づく必要があります。

于 2012-06-04T11:37:03.787 に答える