2016-10-29 2 views
1

내부 작업을위한 큰 벡터를 만드는 함수가 있습니다. 이 함수를 여러 번 호출해야 할 필요가 있다고 가정 해보십시오.C++ 여러 번 호출되는 함수의 큰 벡터

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); 
} 

방법 어떻게 (요소, 성능입니다 코드의 품질 ..)

방법 1 벡터의 메모리 생성/파괴를 처리하는 가장 좋은 방법 2는 방법 1보다 확실히 빠르지 만 추한 것처럼 보입니다. 최상의 접근 방식은 무엇입니까

+0

재미있는 점은 성능 향상을 야기하는 것이 실제로 벡터의 v (n);에서 계속 진행되어 속도가 느려지는 것입니다. 적어도 내가 생각하는 것. 첫 번째 방법에서 강제로 예약 통화가 2 번 가능할 수 있습니다. –

+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

예제에 따르면 벡터 크기는 동일하므로 하나의 벡터 만 만들면 안됩니까? 방법 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

요점은 두 가지 방법을 벤치마킹하려는 것입니다. –

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

는, 정적 벡터 발생한 것을, 단지 크기를 변경한다, 그러나 예약 된 공간이 크기보다보다 더 때문에이 용량에 변화가 없으며, 경우 루프를 반복하면서 하나 씩 증가합니다. 따라서 크기가 매번 1 씩 증가합니다. 용량에는 변화가 없습니다. 보통 크기가 int 인 빈 벡터에서 resize가 호출되면 크기 조정 범위의 벡터 요소가 0으로 초기화됩니다.

벡터는 크기가 n이지만 크기가 가장 큰 (예를 들어 n = 100이면 용량 128, n = 200 일 때, 용량 256 등) n은 2^k 정수 값을 용량으로 사용합니다. 또한 메서드 하나를 호출 할 때 함수가 범위를 벗어날 때마다 만들고 파괴 할 수 있습니다. 벡터는 값이 없으므로 비어 있음에 유의해야합니다.

방법 2에서 벡터는 정적이며 남아 있습니다.

Reserve

또한

Capacity

당신이 벡터 예비 메모리를 가지고, 당신에게 를 가정하는 경우,의 양에 의해 방해되지 않을 수 있습니다

당신 읽을 수 있습니다 상환 된 분석에 의한 상수 삽입과 함께 메모리의 사전 할당은 각 연산에 ​​대해 Big-O (1)을가집니다.

관련 문제