이 문서는 먼저 개인 블로그 나타났다 https://kezunlin.me/post/65dc693d/ 최신 내용에 오신 것을 환영합니다!
기능과 같은 CPP 매크로 성능 프로파일 러를 구현하는
안내서
매크로 확장
이름 ===> 인용 문자열 "XXX"로
이름, 이름 ===> XXX
- ## B ===> CONCATENATE 앞뒤 토큰.
// #name ===> "xxx"
// name, ##name ===> xxx
// ##name ===> concatenate
// #name ===> quote as strings
// a ## b ===> concatenate the preceding and following tokens.
#define QUOTE(name) #name
#define CONCAT(x,y) x##y // x ## y space in ommited
#define MACRO(name) #name "foo"
#define MACRO2(name) name "foo"
#define MACRO3(name) ##name "foo"
#define CAT(a, ...) a ## __VA_ARGS__
#define IIF(c) CAT(IIF_, c)
#define IIF_0(t, ...) __VA_ARGS__
#define IIF_1(t, ...) t
void macro_demo()
{
QUOTE(test); // "test"
CONCAT(test, foo); // testfoo
MACRO(test); // "test" "foo"
MACRO2(test);// test "foo"
MACRO3(test);// test "foo"
}
매크로 기능
밝히다
#define SUM(a,b) (a+b)
#define MYDEBUG(...) fprintf(stderr, ##__VA_ARGS__)
용법
int c = SUM(1,2);
MYDEBUG("%d,%d \n",1,2); /* Becomes fprintf(stderr,"%d,%d \n",1,2); */
클래스 객체와
밝히다
class profiler {
public:
profiler(const char* func_name, unsigned int times = 1);
~profiler();
void start();
int stop();
private:
boost::posix_time::ptime pt1;
boost::posix_time::ptime pt2;
const char * m_func_name;
int m_times = 1;
};
#define ONCE_PROFILER() profiler _profiler_instance##__LINE__(__FUNCTION__)
#define BEGIN_PROFILE_ONE(name) profiler _profiler_##name(#name)
#define BEGIN_PROFILE_TIMES(name,times) profiler _profiler_##name(#name,times)
#define BEGIN_PROFILE(name,...) profiler _profiler_##name(#name, ##__VA_ARGS__)
#define END_PROFILE(name) _profiler_##name.stop()
용법
void main()
{
BEGIN_PROFILE(LoadImage);
load_image();
END_PROFILE(LoadImage);
BEGIN_PROFILE_TIMES(ProcessImageTimes, 100);
//BEGIN_PROFILE(ProcessImageTimes, 100);
for(int i=0; i<100;i++){
process_image();
}
END_PROFILE(ProcessImageTimes);
}
참고
역사
- 20191010 : 만들었습니다.
저작권
- 포스트 저자 : kezunlin
- 포스트 링크 : https://kezunlin.me/post/65dc693d/
- 저작권 공지 : 추가로 명시하지 않는 한이 블로그의 모든 기사는 CC BY-NC-SA 3.0에 의거하여 라이센스가 부여됩니다.