std::chrono - 0. chrono가 왜 필요한가?

2022. 9. 21. 16:20C++

C++11 이전에 시간/날짜를 측정하기 위해서는 외부 라이브러리를 사용하거나 <ctime> 표준 라이브러리를 사용해야 했다. 하지만 <ctime> 라이브러리의 사용은 프로젝트에서 시간의 단위 변환이 많아질수록 사용이 까다롭고 버그가 발생할 확률이 높아졌는데, 그 이유는 다음과 같다.

  •  단위 변환을 위해서 직접 특정 값을 곱하거나 나누어줘야 했으므로 프로젝트 내 특정 단위를 사용하다가 다른 단위를 사용하기로 설계를 수정한다면 모든 코드를 변경해야 한다.
#include <iostream>
#include <ctime>

void g(time_t milliseconds)
{
    std::cout << milliseconds << std::endl;
}

void f(time_t minutes)
{
    g(minutes * 60 * 1000); // milliseconds
}

int main()
{
    time_t seconds{};
    ...
    f(seconds / 60); // minutes
}

위 코드에서 함수 f의 매개변수를 다른 단위를 받도록 변경했다고 해보자. 그럼 이 함수를 호출하는 모든 곳과 이 함수 내부에서 호출하는 g 함수의 인자 값도 수정해야 한다.

  • 시간의 타입(time_t)이 타입에 상관없이 숫자를 입력받는 타입(arithemtic type)이다. 즉, time_t 타입 변수가 가지고 있는 값이 어떤 단위인지 직관적이지 않으며, 실수로 다른 단위의 값을 넣어도 정상적으로 컴파일이 된다.
void f(time_t milliseconds);

int main()
{
    time_t seconds{};
    ...
    f(seconds / 60); // Mistake!
}

 

C++11부터는 이러한 문제를 해결하여 chrono 라는 표준 라이브러리를 도입하였다.

지금부터 이 라이브러리를 이루고 있는 구성 요소들에 대하여 하나씩 살펴보자.