2016-10-29 11 views
1

私は、内部作業のための大きなベクトルを作成する関数を持っています。この関数を何度も呼び出す必要があるとします。ベクトルのメモリの作成/破壊を処理するための最良の方法は何だ(要因は、パフォーマンス、コードの品質です。)C++大きなベクトルが複数回呼び出される

方法1:

void f(int n) { 
    vector<int> v(n); 
} 

int main() { 
    for (int i = 0; i < 1000000; ++i) f(10000000); 
} 

方法2:

void f(int n) { 
    static vector<int> v; 
    v.reserve(99999999); // say this is the maximum possible size 

    v.resize(n); 
} 

int main() { 
    for (int i = 0; i < 1000000; ++i) f(10000000); 
} 

方法2は方法1よりもはるかに高速ですが、見た目は醜いです。 最適なアプローチは何ですか

+0

パフォーマンスの向上を引き起こしているのは興味深いことですが、実際には、ベクトル v(n);で遅れを遅らせています。少なくとも私が思うもの。おそらく2つの予約呼び出しが第1の方法で強制される。 –

+0

また、ソースからstlへのベクトルはコンパイラに固有です。 –

答えて

3

operator()のクラスに関数を変換します。

class f_class { 

    std::vector<int> v; 

public: 

    f_class() 
    { 
     v.reserve(99999999); 
    } 

    void operator()(int n) 
    { 
     v.resize(n); 
     // Whatever the original f() did 
    } 
}; 

int main() { 

    f_class f; 

    for (int i = 0; i < 1000000; ++i) f(i); 
} 
+0

まだこの解決法では、呼び出し元(ここではmain())はclass_fがベクトルを使用することを認識しなければなりませんが、各繰り返しでclass_f()(i)つまり、外部は、OOPの原則(カプセル化、抽象化)にはうまく合わないclass_fの実装について少し知っていなければならないということです。 –

0

あなたの例によると、あなたのベクトルのサイズは同じですから、ベクトルを1つだけ作成してみてはいかがですか?方法2において

using namespace std; 
    void f(vector<int>& v) { 
     // Do something with vector 
    } 
    int main() { 

     int n = 10000000; 
     vector<int> v(n); 

     for (int i = 0; i < 1000000; ++i) 
      f(v); 
    } 
+0

ポイントは、2つの方法をベンチマークしようとしています。 –

0
v.reserve() //deals with capacity. 
v.resize(n) //deals with size. 

は、静的ベクトルが経験しているものだけでサイズを変更しているが、予約領域のサイズよりも以上である、従ってそこ容量に変化はなく、場合にあなたはループを反復しているだけで、それは1だけ増加します。したがって、サイズは毎回1ずつ増えます。キャパシティに変化はありません。 通常空のベクトルのintに対してresizeが呼び出された場合、そのサイズ変更範囲のベクトル要素は0に初期化されます。

方法1では、ベクターはサイズがnで作成されますが、 (たとえば、n = 100の場合は容量128、n = 200の場合は容量128、容量などは256)。また、メソッド1を呼び出すときには、関数が範囲外になるたびに作成および破棄されます。ベクトルには値がないため、空であることに注意してください。

方法2では、ベクトルは静的であり、残ります。

Reserve

また

Capacity

あなたはベクトル予備のメモリを備え、そしてあなたにを想定している場合は、の量に悩まされないことがあります。

あなた読むことをお勧めします償却分析による一定の挿入を伴うメモリの事前割当は、各操作についてBig-O(1)を有する。