Namespaces
Variants

std::chrono:: duration

From cppreference.net
헤더에 정의됨 <chrono>
template <

class Rep,
class Period = std:: ratio < 1 >

> class duration ;
(C++11 이후)

클래스 템플릿 std::chrono::duration 는 시간 간격을 나타냅니다.

이는 Rep 타입의 틱 카운트와 틱 주기로 구성되며, 틱 주기는 컴파일 시간 유리수 fraction 으로, 한 틱에서 다음 틱까지의 시간(초)을 나타냅니다.

duration 에 저장되는 유일한 데이터는 Rep 타입의 틱 카운트입니다. Rep 가 부동 소수점인 경우, duration 은 틱의 분수도 표현할 수 있습니다. Period 는 duration 타입의 일부로 포함되며, 서로 다른 duration 간 변환 시에만 사용됩니다.

목차

멤버 타입

멤버 타입 정의
rep Rep , 산술 타입 또는 산술 타입을 에뮬레이트하는 클래스로, 틱의 수를 나타냄
period Period (C++17까지) typename Period :: type (C++17부터) , std::ratio 를 나타내며, 틱 주기를 표현함 (즉, 틱 당 초의 분수 값)

멤버 함수

새로운 duration을 생성
(public member function)
내용을 할당
(public member function)
틱 카운트를 반환
(public member function)
[static]
특수 duration 값 zero를 반환
(public static member function)
[static]
특수 duration 값 min을 반환
(public static member function)
[static]
특수 duration 값 max를 반환
(public static member function)
단항 +와 단항 -를 구현
(public member function)
틱 카운트를 증가 또는 감소
(public member function)
두 duration 간의 복합 할당을 구현
(public member function)

비멤버 함수

duration을 인자로 하는 산술 연산 구현
(함수 템플릿)
(C++11) (C++11) (C++20에서 제거됨) (C++11) (C++11) (C++11) (C++11) (C++20)
두 duration 비교
(함수 템플릿)
duration을 다른 틱 간격을 가진 duration으로 변환
(함수 템플릿)
duration을 다른 duration으로 변환 (내림)
(함수 템플릿)
duration을 다른 duration으로 변환 (올림)
(함수 템플릿)
duration을 다른 duration으로 변환 (가장 가까운 값으로 반올림, 동점시 짝수로)
(함수 템플릿)
duration의 절대값 구하기
(함수 템플릿)
(C++20)
duration 에 대한 스트림 출력 수행
(함수 템플릿)
지정된 형식에 따라 스트림에서 duration 파싱
(함수 템플릿)

헬퍼 타입

아래 표에서 사용되는 /* intXX */ 타입은 최소 XX 비트를 갖는 부호 있는 정수 타입을 의미합니다.

유형 정의
std::chrono::nanoseconds std :: chrono :: duration < /* int64 */ , std:: nano >
std::chrono::microseconds std :: chrono :: duration < /* int55 */ , std:: micro >
std::chrono::milliseconds std :: chrono :: duration < /* int45 */ , std:: milli >
std::chrono::seconds std :: chrono :: duration < /* int35 */ >
std::chrono::minutes std :: chrono :: duration < /* int29 */ , std:: ratio < 60 >>
std::chrono::hours std :: chrono :: duration < /* int23 */ , std:: ratio < 3600 >>
std::chrono::days (C++20부터) std :: chrono :: duration < /* int25 */ , std:: ratio < 86400 >>
std::chrono::weeks (C++20부터) std :: chrono :: duration < /* int22 */ , std:: ratio < 604800 >>
std::chrono::months (C++20부터) std :: chrono :: duration < /* int20 */ , std:: ratio < 2629746 >>
std::chrono::years (C++20부터) std :: chrono :: duration < /* int17 */ , std:: ratio < 31556952 >>

참고: hours 까지의 미리 정의된 duration 타입 각각은 최소 ±292년 범위를 커버합니다.

미리 정의된 각 duration 타입 days , weeks , months years 는 최소 ±40000년 범위를 포함합니다. years 는 365.2425 days (그레고리력의 평균 연도 길이)와 동일합니다. months 는 30.436875 days (정확히 years 의 1/12)와 동일합니다.

(C++20부터)

헬퍼 클래스

std::common_type 특수화
(클래스 템플릿 특수화)
duration이 다른 틱 주기를 가진 duration으로 변환 가능함을 나타냄
(클래스 템플릿)
주어진 타입의 틱 카운트에 대한 zero, min, max 값 생성
(클래스 템플릿)
duration 에 대한 포맷팅 지원
(클래스 템플릿 특수화)
std::chrono::duration 에 대한 해시 지원
(클래스 템플릿 특수화)

헬퍼 특수화

template < class Rep, class Period >

constexpr bool enable_nonlocking_formatter_optimization < chrono :: duration < Rep, Period >>

= enable_nonlocking_formatter_optimization < Rep > ;
(C++23부터)

이 특수화는 std::enable_nonlocking_formatter_optimization std::print std::println 의 효율적인 구현을 가능하게 하여, 템플릿 매개변수 Rep 가 이를 허용할 때 chrono::duration 객체의 출력을 지원합니다.

리터럴

인라인 네임스페이스 std::literals::chrono_literals 에 정의됨
시간을 나타내는 std::chrono::duration 리터럴
(함수)
분을 나타내는 std::chrono::duration 리터럴
(함수)
초를 나타내는 std::chrono::duration 리터럴
(함수)
밀리초를 나타내는 std::chrono::duration 리터럴
(함수)
마이크로초를 나타내는 std::chrono::duration 리터럴
(함수)
나노초를 나타내는 std::chrono::duration 리터럴
(함수)

참고: 리터럴 접미사 d y days years 를 의미하는 것이 아니라, 각각 day year 를 나타냅니다.

(C++20부터)

참고 사항

duration 객체 d 가 보유하는 실제 시간 간격(초 단위)은 대략적으로 d. count ( ) * D :: period :: num / D :: period :: den 와 같습니다. 여기서 D chrono::duration<> 타입이며, d 는 해당 타입의 객체입니다.

기능 테스트 매크로 표준 기능
__cpp_lib_chrono_udls 201304L (C++14) 시간 타입에 대한 사용자 정의 리터럴

예제

이 예제는 여러 사용자 정의 duration 타입을 정의하고 타입 간 변환하는 방법을 보여줍니다:

#include <chrono>
#include <iostream>
using namespace std::chrono_literals;
template<typename T1, typename T2>
using mul = std::ratio_multiply<T1, T2>;
int main()
{
    using microfortnights = std::chrono::duration<float,
        mul<mul<std::ratio<2>, std::chrono::weeks::period>, std::micro>>;
    using nanocenturies = std::chrono::duration<float,
        mul<mul<std::hecto, std::chrono::years::period>, std::nano>>;
    using fps_24 = std::chrono::duration<double, std::ratio<1, 24>>;
    std::cout << "1 second is:\n";
    // 정수 스케일 변환 (정밀도 손실 없음): 캐스트 불필요
    std::cout << std::chrono::milliseconds(1s).count() << " milliseconds\n"
              << std::chrono::microseconds(1s).count() << " microseconds\n"
              << std::chrono::nanoseconds(1s).count() << " nanoseconds\n";
    // 정수 스케일 변환 (정밀도 손실): 캐스트 필요
    std::cout << std::chrono::duration_cast<std::chrono::minutes>(1s).count()
              << " minutes\n";
    // duration_cast 대안:
    std::cout << 1s / 1min << " minutes\n";
    // 부동소수점 스케일 변환: 캐스트 불필요
    std::cout << microfortnights(1s).count() << " microfortnights\n"
              << nanocenturies(1s).count() << " nanocenturies\n"
              << fps_24(1s).count() << " frames at 24fps\n";
}

출력:

1 second is:
1000 milliseconds
1000000 microseconds
1000000000 nanoseconds
0 minutes
0 minutes
0.82672 microfortnights
0.316887 nanocenturies
24 frames at 24fps