멈추지 않고 끈질기게

[C++][메모용] reserve() vs resize() / 시간 측정(std::chrono) 본문

C++

[C++][메모용] reserve() vs resize() / 시간 측정(std::chrono)

sam0308 2024. 10. 17. 15:51

※ 해당 포스팅은 개인의 공부 정리용 글입니다. 틀린 내용이 있다면 추후 수정될 수 있습니다.

※ 해당 포스팅은 하기 출처들을 참조하였습니다.

 - https://stackoverflow.com/questions/7397768/choice-between-vectorresize-and-vectorreserve

 

Choice between vector::resize() and vector::reserve()

I am pre-allocating some memory to my a vector data member. Example: class A { vector<string> t_Names; public: A () : t_Names(1000) {} }; At some point in time, if the t_Names.si...

stackoverflow.com

- https://m.blog.naver.com/jeann/222135392649

 

C++11 chrono로 elapsed time (경과 시간/수행 시간) 측정하기

chrono 라이브러리는 boost 라이브러리 1.47에 포함되어 C++ 11 버전에서 표준으로 채택된 라이브러리로, ...

blog.naver.com

 

 

1. reserve() vs resize()

 - vector<T> 클래스에 존재하는 함수

 - reserve()는 단어 의미 그대로 원소를 넣을 공간을 예약하는 함수로, capacity를 전달한 값으로 늘림

   즉, 실제 원소 갯수는 변하지 않음

 - 현재 capacity보다 작은 값을 넣을 경우, 아무 일도 일어나지 않음

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> vec{ 1, 2, 3, 4, 5 };

    vec.reserve(10);
    for (const int n : vec)
        cout << n << " ";
    cout << endl;

    cout << "벡터의 size: " << vec.size() << "\n";
    cout << "벡터의 capacity: " << vec.capacity() << "\n";

    vec.reserve(5);
    for (const int n : vec)
        cout << n << " ";
    cout << endl;

    cout << "벡터의 size: " << vec.size() << "\n";
    cout << "벡터의 capacity: " << vec.capacity() << "\n";
}

사진 1. reserve() 결과

 

 

 - resize()의 경우 실제 원소 갯수를 전달한 값으로 증가시킴

   capacity가 부족하다면 당연히 원소 수에 맞춰서 증가시키고, 해당 자료형의 기본값이 들어감

 - 현재 원소 갯수보다 작은 값을 넣을 경우, 해당 갯수만큼만 남기고 원소 삭제(capacity는 변동 없음)

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> vec{ 1, 2, 3, 4, 5 };

    vec.resize(10);
    for (const int n : vec)
        cout << n << " ";
    cout << endl;

    cout << "벡터의 size: " << vec.size() << "\n";
    cout << "벡터의 capacity: " << vec.capacity() << "\n\n";

    vec.resize(3);
    for (const int n : vec)
        cout << n << " ";
    cout << endl;

    cout << "벡터의 size: " << vec.size() << "\n";
    cout << "벡터의 capacity: " << vec.capacity() << "\n";
}

사진 2. resize() 결과

 

 

 - 또한, 클래스 타입의 벡터일 경우 해당 클래스의 생성자를 호출함

   예를 들어 resize()를 통해 3개의 원소를 추가했다면 생성자가 3번 호출됨

#include <iostream>
#include <vector>

using namespace std;

class Test
{
public:
    Test() { cout << "기본 생성자 호출!\n"; }
};

int main()
{
    vector<Test> vec;
    vec.resize(3);
}

사진 3. resize()의 생성자 호출

 

 

 

2. 시간 측정(std::chrono)

 - 코드 실행 시간을 측정하는 데 사용하기 편리한 네임스페이스로 std::chrono가 있음(C++ 11 이상)

 - chrono 헤더 포함 필수(#inlcude <chrono>)

 - 이하의 함수들은 std::chrono:: 를 붙여야 하므로 번거롭다면 using namespace 사용

#include <iostream>
#include <chrono>

using namespace std;
using namespace chrono;

 

 - system_clock::now() 함수를 통해 현재 시간을 기록할 수 있음

 - 상기 함수를 호출하여 기록되는 시간은 기본 nano seconds 단위이나, duration_cast<milliseconds>() 함수를 통해

   ms 단위로 변환 가능

 - (종료 시간 - 시작 시간) 값의 count() 함수를 출력하면 실제 실행 시간을 출력 가능

int main()
{
    // 시작 시간 기록
    time_point<system_clock> start = system_clock::now();

    // 시간 측정용 코드
    int n = 0;
    for (int i = 0; i < 10000; ++i)
        for (int j = 0; j < 10000; ++j)
            n = i + j;

    // 종료 시간 기록
    auto end = system_clock::now();

    // 최종 실행 시간 출력
    auto time_gap = std::chrono::duration_cast<milliseconds>(end - start);
    cout << "코드 실행 시간: " << time_gap.count() << "ms\n";
}

사진 4. chrono를 통한 시간 측정

 

 

 

'C++' 카테고리의 다른 글

[C++][메모] 옛날 문법 정리  (1) 2024.11.03
[C++][메모용] map 관련 정리  (0) 2024.08.01
[C++] std::endl vs "\n"  (2) 2024.07.23
[C++] 람다 표현식(lambda expression)  (0) 2023.12.05
[C++] 스마트 포인터(Smart Pointer)  (0) 2023.11.23