2017-10-31 2 views
-1

나는 C++ vector에 대해 질문이있다. 내가 입력 1000000벡터 (INT)에와 push_back을 테스트하고 만
4 밀리 초
캐시를 사용하여 벡터를 빠르게 만들거나 무엇을 할 수 있습니까?

vector <int> Test; 
    auto start_t = chrono::high_resolution_clock::now(); 
    for (int i = 0; i < 1000000; i++) Test.push_back(i); 
    cout << chrono::duration_cast<chrono::milliseconds>(chrono::high_resolution_clock::now() - start_t).count() << " milliseconds\n" << endl; 

하지만 난 내 자신의 배열 엔진을 만든 경우에도이 작업을 수행하는 데 약 3 분 걸렸다 년대에 끝났다 이 크기 (할당 * 2) (각 할당 시간마다) 할당 할당을 설정합니다. 각 할당 시간에 대해

template <typename T> 
class Array { 

private: 

    T * storage_; 

    int alloc_ = 0; 
    int count_ = 0; 
    int all_ = 0; 
public: 

    Array() = default; 
    ~Array() { delete[] storage_; } 

    void Set(const T & __t) { 

     if(count_ + 1 >= alloc_) { 

      T * temp = new T[count_ * 2 + 4]; 
      if(count_ > 0) for (int i = 0; i < count_; i++) temp[i] = storage_[i]; 
      delete[] storage_; 
      storage_ = temp; 
      all_++; 
     } 
     storage_[count_++] = __t; 
    } 

    int all() { return all_; } 
    int count() { return count_; } 
}; 

... 얼마나 가능한가이 속도? 캐시입니까? 왜냐하면 나는 그것을 C++ 최적화로 믿지 않기 때문에 최적화 과정에서 어떤 일이 일어 났는가? 이렇게 빨리 벡터를 만들 수는 없다 ... 나는 completly 캐시이거나 1000000 번을 다시 찾아서 1000000 크기를 할당하는 것을 감지한다. 시작과 진행 과정에서 ... 사실입니까 아니면 다른 것입니까?

+3

또는 무엇을 말하고 싶습니다 – StoryTeller

+2

[std :: vector :: reserve] (http://en.cppreference.com/w/cpp/container/vector/reserve)를 사용하는 것이 좋습니다. C++ [containers] 문서 (http://en.cppreference.com/w/cpp/container). BTW, 몇몇 C++ 표준 라이브러리는 무료 소프트웨어 ([GCC] (http://gcc.gnu.org/)와 같은 C++ 컴파일러에 포함되어 있습니다 ...)로 구현 및 소스 코드를 연구 할 수 있습니다. –

+0

'__t'는 UB.͏͏͏͏͏͏ – Bathsheba

답변

2

alloc_을 설정하지 않았기 때문에 재 할당 논리가 손상되었습니다. 따라서 매번 다시 할당됩니다. 그리고 귀하의 all_ 회원은 의미가 없습니다. 이 두 변수를 어떻게 든 혼란스럽게 보입니다.

+0

이 아닙니다. all_은 할당량을 얻기 위해 alloc_ (할당 된 크기를 얻으려면)을 사용하도록 설정된 소스 재 할당 횟수를 확인하는 것입니다. – Ali

+0

아, 그러면 실제로 변수를 확인하고이를 알아 냈어야합니다. 'Set'를 호출 할 때마다 다시 할당됩니다. 이것이 바로 약어가 나쁜 이유입니다. 당신은 그 변수'allocations_'를 호출 했어야합니다. –

관련 문제