Cppformat에 대해서 알아봅시다 v 0.7

JongSungHwang 2,490 views 19 slides Apr 20, 2016
Slide 1
Slide 1 of 19
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19

About This Presentation

초안입니다.
지속적 업데이트 예정입니다.


Slide Content

CppFormat http://cppformat.github.io/latest/

CppFormat

라이브러리는 만들어진 이유가 있다 이런 유사한 기능을 수행하기 위한 방법들은 많음 Printf IOStream Boost Format FastFormat 그렇지만 이 라이브러리들은 심각한 이슈들을 갖고 있거나 필요로 하는 모든 기능들을 제공하지 않았다

printf ? printf 는 빠르고 C standard library 때부터 친숙한 녀석 주요 문제점이라면 … user-defined type 을 지원하지 않는다 또한 안전성 문제

IOStreams IOStreams 의 문제는 다음의 예제 코드를 보면 … std :: cout << std :: setprecision (2) << std ::fixed << 1.23456 << “\n”; printf 에서는 위의 코드를 다음과 같이 간략화 가능 printf (“%.2f\n”, 1.23456);

Boost Format Library? 굉장히 강력한 라이브러리 Printf 처럼 사용할 수도 있고 , 매개변수의 순서를 이용하는 방법도 제공 그렇지만 성능에서 큰 결점 여러 벤치마크에 따르면 다른 방법들보다 매우 ! 매우 ! 느립니다 . Boost Format 은 빌드에 걸리는 시간도 매우 … 오래 걸립니다 . Library Method Run Time, s EGLIBC 2.19 printf 1.30 libstdc++ 4.8.2 std::ostream 1.85 C++ Format 1.0 fmt::print 1.42 tinyformat 2.0.1 tfm::printf 2.25 Boost Format 1.54 boost::format 9.94

Boost Format Library? Tinyformat 은 IOStreams 에 근접했지만 , 내부적으로 IOStream 을 사용하기 때문에 그보다 빨라질 수는 없습니다 cppformat 은 printf 에 근접했으며 , integer formattin 에서는 printf 보다 빠르기도 합니다 Library Method Run Time, s EGLIBC 2.19 printf 1.30 libstdc++ 4.8.2 std::ostream 1.85 C++ Format 1.0 fmt::print 1.42 tinyformat 2.0.1 tfm::printf 2.25 Boost Format 1.54 boost::format 9.94

fmt ::format Python 의 str.format 과 유사한 방법 반환값은 std ::string type 중괄호 내부에 숫자를 넣어 매개변수 리스트에 접근 가능

fmt ::format wide char 또한 지원 그 뿐만 아니라 narrow char -> wide char 로의 변환도 가능 wide -> narrow 의 경우는 당연히 지원하지 않음

fmt ::format – Safety! 매개변수로 받은 값의 type 이 의도한 type 이 아닌 경우 compile error 를 발생시킬 수 있다 {:d}, {:s}, {:f} 등의 형식 지정자를 사용하여 전달받은 매개변수 타입이 일치하지 않는 경우 컴파일 에러 발생 위와 값이 parameter 의 순서와 fmt :: arg 또는 operator”” _a 와 같이 사용 가능

_format 마찬가지로 using namespace fmt ::literals; 사용해야 함 fmt ::format 함수를 간편하게 사용할 수 있습니다

fmt ::print 내부는 이렇게 생겼습니다 .

fmt :: arg & _a fmt :: arg 는 ArgList 로 전달된 값에 이름을 지정할 수 있도록 해줌 operator”” _a 를 이용하여 간단하게 사용 가능 using namespace fmt ::literals;

FMT_VARIADIC FMT_VARIADIC 매크로를 사용하여 임의의 매개변수를 받아 formatting 하고 출력하는 자체 함수를 만들 수 있습니다 직접 template 함수를 만들 수도 있지만 , 제공하는 기능을 사용하면 더 간단합니다 // Prints formatted error message. void report_error ( const char *format, fmt :: ArgList args ) { fmt ::print("Error: "); fmt ::print(format, args ); } FMT_VARIADIC(void, report_error , const char *)

FMT_VARIADIC report_error ("file not found: {}", path); 위와 같이 사용하면 됩니다 fmt :: ArgList 매개변수를 받는 함수를 정의하기만 하면 됩니다 FMT_VARIADIC 이 매개변수에 접근하는 랩퍼를 자동으로 정의해줍니다

fmt :: MemoryWriter character stream 으로의 데이터 작성과 formatting 을 제공합니다 . 결과물은 동적으로 변경되는 메모리 버퍼에 저장됩니다 . 종류는 2 가지가 있습니다 MemoryWriter typedef BasicMemoryWriter <char, std ::allocator<char>> WMemoryWriter typedef BasicMemoryWriter < wchar_t , std ::allocator< wchar_t >>

fmt :: MemoryWriter write 메소드 formatted data 를 작성 << 연산자로도 제공하여 손쉽게 사용 가능

fmt :: MemoryWriter Move 시맨틱을 사용 , = 연산자를 이용하여 버퍼의 값을 옮길 수 있다

fmt :: MemoryWriter