학습가이드 도전X도전 문제를 풀면서 심화된 내용을 기록한다.

문제를 읽는 것 조차 어려웠다 ScopeTimer 라는 이름의 프로파일링용? 클래스를 만들어야하는데
RAII 기반으로 만들어야한다. 도데체 무슨말인가 싶어서 검색을 했다.

c++ 에서 스코프는 함수의 범위라는것이 생각났다 즉 scopeTimer 란 어떠한 함수가 있으면 그함수의 작동시간을 측정하는 함수였던 것이다. 이 함수가 RAII기법을 활용하여 구현을 한다는데 RAII 기법이 도데체 뭘까 싶어서 검색을 또 해보았다.



위 내용과 예시를 보면서 정리하자면, 스마트포인터를 활용하여 동적메모리를 자동으로 해제하게 해주는 기법이라고 한다. 즉, 이러한 구조로 이루어진 매커니즘 자체를 RAII 기법이라고 한다.
그렇다면이제 배운것을 토대로 ScopeTimer 클래스를 만들어 클래스 멤버함수를 통해 특정 스코프의 경과시간을 측정할 수있는 코드를 구현해야한다 여기서 우리가 사용하려는 클래스 안에 멤버함수가 RAII 기법으로 구현이 되야한다는말이다 RAII 기법이란 자원 관리의 책임을 위임한다는 뜻이라고 한다 사용자가 직접 메모리를 할당하고 해제하는게 아닌 메모리가 있으면 범위를 벗어나게 되면 자동으로 해체되어야한다는 말이다. 여기까지는 이해를 했으나 구현하는 방법 자체는 모르기때문에 AI의 도움을 받아서 구현했다. chrono STL 을 사용하여 스코프타이머 함수를 구현했는데 굉장히 어려운 내용이많았다.

코드의 맥락은 이러하다. 생성자가 호출이되면 시작시간을 저장하고 소멸자가 호출이되면 끝시간에서 시작시간을 빼서 총 작동시간을 계산하는 방식이다. chrono::high-resolution_clock 이것은 clock 구조체 라고 하는데 총 3가지가있다.

위 내용을 참고해보면 시간의 해상도가 가장높게 제공하는 것을 사용하고 있는것을 알 수 있다.
여기서 스코프타이머함수의 의도를 알 수 있었는데, 시간의 해상도가 높을 수록 어떠한 기계나 무언가의 작동을 벤치마킹하는 구조에서 1초 2초 가아니라 1초를 1000ms 로 이런식으로 계산을하면 1~2초 사이의 값을 구해올 수 있다. 그렇게되면 조금 더 정밀하게 성능이 얼마나 좋은지 알 수 있게되는것이다. 때문에 시간의 해상도가 높은 것을 사용하는것이 좋다. 마지막으로 TimePoint인데 시스템 내부적으로 정해놓은 기준시점이있다 ex) 윈도우 1601년 1월1일 리눅스 1970년 1월1일 / 그 시점을 기준으로 정해놓고 얼마나 경과하였는지를 나타내는 템플릿이다. 첫번째인자로 clock를받아오고 두번째인자로 duration 을 받아온다 즉 두번째인자는 생략이되었는데 첫번째 인자를 살펴보면 아까 설명한 '해상도가 가장높은 시간' 으로 두번째 인자 'duration' 동안을 받아오게 된다. 즉 변수로 선언한 start_time 은 종합적인 의미로 "시스템에서제공하는 가장 정밀한시계로 현재시점을 기록할 수 있는 시계를 만들었다" 라는 의미가 되는것이다. 따라서 생성자 구문에서 now를 활용해 시작시간을 설정하고 소멸자에서 소멸자가호출되는 그시간도 저장을해서 두시간을 이용해 얼마나 시간이 지났는지 계산을 할 수 있었던 것이다.