검색결과 리스트
Visula C++ 11에 해당되는 글 2건
- 2012.08.16 [ VC11-C++11 ] chrono - clock 클래스
- 2012.08.09 [ VC11-C++11 ] chrono - 시간 계산
이번은 chrono의 clock 클래스에 대해서 간단하게 설명 하겠습니다.
앞의 글들을 보신 분 들은 아시겠지만 이미 clock 클래스를 사용하고 있었습니다.
다만 저는 현재까지는 system_clock 이라는 클래스만을 사용하고 있었습니다.
chrono에는 system_clock뿐만 아닌 steady_clock과 high_resolution_clock이 있습니다.
namespace std {
namespace chrono {
class system_clock;
}}
namespace std {
namespace chrono {
class steady_clock;
}}
namespace std {
namespace chrono {
class high_resolution_clock;
}}
system_clock는 가장 일반적으로 사용하는 것으로 시스템 시간을 표현하기 위한 시간입니다.
그리고 C 런타임의 time_t와 호환성을 가지고 있습니다.
멤버 중에 to_time_t와 from_time_t가 있는데 이름을 보면 알 수 있듯이
to_time_t는 system_clock::time_point를 time_t로 변환하고,
from_time_t는 time_t를 system_clock::time_point로 변환 합니다.
// to_time_t
system_clock::time_point CurTime = system_clock::now();
std::time_t t = system_clock::to_time_t(CurTime);
// from_time_t
std::time_t t = time(NULL);
system_clock::time_point CurTime = system_clock::from_time_t(t);
steady_clock은 물리적인 시간처럼 결코 역행하지 않는 시간을 나타내기 위한 시간입니다.
이 말은 steady_clock 이외의 clock 클래스는 time_point를 얻은 후 os에서 날짜를 과거를 되돌린 후 time_point을 얻으면 앞에 얻은 시간보다 과거의 시간이 얻어지는데 steady_clock에서는 절대 그렇지 않습니다. 그래서 시간의 흐름이 바뀌지 않는 시간을 얻고 싶을 때는 steady_clock을 사용합니다.
high_resolution_clock는 해당 플랫폼(Windows 또는 Linux 등)에서 가장 짧은 단위의 시간입니다.
이 클래스는 system_clock나 steady_clock의 다른 별칭으로 정의되기도 합니다.
보통 프로그래밍에서 아주 고해상도의 시간 단위가 아닌 경우 대부분 GetTickCount() 함수를 사용했는데(Windows에서) 앞으로는 더 간단하고 다양한 표현 방법으로 시간을 다룰 수 있는 chrono를 꼭 사용해 보시기 바랍니다^^
<예제.2>에서 보았듯이 chrono는 다양한 정밀도 타입으로 시간을 표시할 수 있습니다.
그리고 각 시간 정밀도 타입 별로 생성할 때 미리 값을 설정할 수 있습니다.
std::chrono::hours H1(1);
std::chrono::seconds S1(10);
std::chrono::milliseconds MILS1(100);
또한 이 시간 타입을 서로 연산할 수도 있습니다.
std::chrono::hours H1(1);
std::chrono::hours H2(2);
std::chrono::hours H3 = H1 + H2;
물론 다른 시간 타입을 연산할 수도 있습니다
std::chrono::seconds S1(10);
std::chrono::milliseconds MILS1(100);
std::chrono::milliseconds MILS2 = S1 + MILS1;
다른 시간 타입을 연산할 때 주의할 점이 있습니다. 아래처럼
std::chrono::milliseconds MILS2 = S1 + MILS1;
의 경우는 초와 밀리초라는 서로 다른 타입을 더하지만 값을 저장하는 타입이 밀리초이기 때문에 잃어버리는 값이 발생하지 않으므로 연산에 문제가 없습니다.
그러나 아래와 같이
std::chrono:: seconds S2 = S1 + MILS1;
로 하는 경우는 밀리초 부분을 잃어버리게 되기 때문에 컴파일 에러가 발생합니다.
이런 경우는 명시적으로 형 변환을 시켜줘야 합니다.
std::chrono::seconds S2 = std::chrono::duration_cast< std::chrono::seconds >(S1 + MILS1);
< 예제. 3 >
#include <chrono>
#include <iostream>
int main()
{
{
std::chrono::hours H1(1); // 1시간
std::cout << "H1(1) : " << H1.count() << std::endl;
std::chrono::seconds S1(10);
std::chrono::seconds S2(120);
std::cout << "S1(10) : " << S1.count() << std::endl;
std::cout << "S2(120) : " << S2.count() << std::endl;
}
{
std::chrono::hours H1(1);
std::chrono::hours H2(2);
std::chrono::hours H3 = H1 + H2;
std::cout << "H1 + H2 = : " << H3.count() << std::endl;
std::chrono::seconds S1(10);
std::chrono::milliseconds MILS1(100);
std::chrono::milliseconds MILS2 = S1 + MILS1;
std::cout << "S1 + MILS1 = : " << MILS2.count() << std::endl;
std::chrono::seconds S2 = std::chrono::duration_cast< std::chrono::seconds >(S1 + MILS1);
std::cout << "S1 + MILS1 = : " << S2.count() << std::endl;
}
return 0;
}
댓글