C++ 19

C++ STL: std::rbegin, std::rend, std::crbegin, std::crend

std::rbegin, std::rend std::crbegin, std::crend 요약 기본 배열 타입은 자동으로 알맞은 reverse_iterator를 만들어 되돌려 줍니다. 그 외에는 인자로 받은 객체의 동일한 이름의 메서드를 호출합니다. 즉, 알맞은 메서드가 정의되어 있다면 사용자 정의 클래스도 인자로 넘겨 줄 수 있습니다. 설명 std::rbegin 은 마지막 원소 주소를, std::rend 는 처음 원소의1칸 이전 주소를 가리키는 reverse_iterator를 만들어 반환합니다. std::crbegin, std::crend 는 각각 std::rbegin, std::rend 와 동일한 곳을 가리키는 const reverse_iterator를 반환합니다. std::end 가 실제 마지막 원소보..

C++ Reference: std::integer_sequence, std::index_sequence

std::integer_sequence, std::index_sequence Can make integer sequence in compile-time, so it is often used in compile-time indexing. 컴파일 타임에 정수 시퀸스를 가진 녀석을 만들 수 있어, 컴파일 타임 인덱싱 등에 활용되는 녀석입니다. 헤더에 정의되어 있는 클래스입니다. Defined in header template class integer_sequence; template using index_sequence = integer_sequence; std::index_sequence 는 std::integer_sequence의 첫번째 템플릿 파라미터가 std::size_t 로 템플릿 특수화(templa..

C++ 레퍼런스: std::begin, std::end, std::cbegin, std::cend

C++ 레퍼런스 std::begin, std::end std::cbegin, std::cend 요약 기본 배열 타입은 자동으로 알맞은 iterator를 만들어 되돌려 줍니다. 그 외에는 인자로 받은 객체의 동일한 이름의 메서드를 호출합니다. 즉, 알맞은 메서드가 정의되어 있다면 사용자 정의 클래스도 인자로 넘겨 줄 수 있습니다. 설명 std::begin 은 처음 원소의 주소를, std::end 는 마지막 원소의 다음 주소를 가리키는 iterator를 만들어 반환합니다. std::cbegin, std::cend 는 각각 std::begin 과 std::end 의 동일한 주소를 가리키는 const_iterator를 반환합니다. std::begin 이상, std::end 미만 범위 이외의 값을 읽거나 쓰는건 ..

C++ 템플릿(Template): CRTP

항상 느끼는 것 이지만, C 나 C++ 개발자들은 정말 성능 변태가 분명합니다. 특히 템플릿을 배우기 시작하는 분들은 느끼시겠지만, 정말 성능 하나만을 위해 변태같은 짓을 하는것을 서슴치 않는 사람들이 바로 C++ 개발자들 입니다. 이번에 소개해드릴 템플릿 패턴은 CRTP 입니다. CRTP 는 동적 다형성(polymorphism), 즉 기반 클래스 포인터에 파생 클래스 객체의 포인터를 대입해 사용하는 것을 피하면서 가상(virtual) 함수의 override 를 흉내내는 템플릿 기법입니다. CRTP 는 템플릿에 의한 정적 다형성 이므로, 가상함수의 호출에 드는 오버헤드 비용을 없엘 수 있습니다. CRTP 의 약자는 Curiously Recursing Template Pattern 으로, 굳이 의역한다면 ..

C++ 템플릿(Template): 꼬리표 분배(Tag Dispatching) 기법

SFINAE 기법을 사용하면, 새로운 분기가 추가되면 기존 함수들의 템플릿 명세를 수정해야 합니다. 꼬리표 분배 방법은 템플릿 명세로 구분하는 것을, 함수의 인자로 구분하여 사용하는 방법입니다. 기존 함수들의 수정이 필요 없고, 깔끔해 지는 대신 표면에 드러난 함수와 처리하는 함수가 나눠지게 됩니다. 드러난 함수는 타입에 따라 알맞은 꼬리표를 실제 처리하는 함수에 전달해 주고, 처리하는 함수는 꼬리표에 따라 오버로딩해서 사용하는 방법입니다. 전달하는 방식은 템플릿 특수화(template specialization) 혹은 객체 넘겨 주기가 있습니다. 다만 특수화 해야 할 타입이 많고, 기능이 겹친다면 객체에 의한 꼬리표 분배 방식이 더 선호됩니다. 전자를 tag dispatching by type, 후자를..

C/C++ 코드 최적화

C++ 코드 속도 향상 기법 제 주전공인 물리학과 특성상 시뮬레이션 같은걸 돌릴 경우 수 시간에서 수일, 크게는 몇개월 까지 돌리는 일이 많습니다.이 때문에 교수님들이 포트란/C 시절의 극한의 코드 쥐어짜기를 은연중에 설파하시고, 저도 관련 자료들을 많이 찾아 봤습니다.아래는 제가 경험적으로 알게 됬거나 구글링을 통해 찾아 본 방법이며, 하드웨어, 컴파일러마다 다른 결과가 나올 수 있습니다. 피드백은 언제나 환영합니다 본 내용은 제가 예전에 발표한 코드 최적화 프레젠테이션을 문서화 한 것입니다. (아직 덜 옮겨적었습니다)PPT 에 다 못한 얘기들을 더 추가할 예정입니다. 목차1. 서론2. 일반적인 방법3. 하드웨어 동작 기반4. 그 외 1. 서론 (프로파일링 등을 하여) 정확히 어떤 곳을 최적화 할지 알..

C++ 2020.05.26

CMake로 Root 프로젝트 설정하기

https://root.cern/ ROOT a Data analysis Framework | ROOT a Data analysis Framework root.cern ROOT야 말로 진짜 빅 데이터를 다루는 프로그래밍 툴입니다. 저도 기억은 잘 안나는데 천공카드 시절부터 코딩을 하신 저희과 물리학 교수님께 들은바에 의하면 유럽입자물리연구소(CERN) 에서 수십년전에 개발한 과학용 툴로, 실험 한번에 수십 페타바이트 이상 생기는 데이터를 처리하고, 이를 정리하는 그래프 등을 시각화하는데 쓰이고 있다고 하네요. 아직도 CERN에서 발표하는 자료의 표나 그래프들은 ROOT를 이용하여 그린다고 합니다. 각설하고 이를 CMake를 이용해서 사용하는법을 소개하겠습니다. 1. github https://github...

초보도 따라하는 모던 C++ 튜토리얼

이 강좌는 제가 여러 책들과 수많은 사이트에서 배우고, 직접 코딩 하면서 알게 된 모던 C++ (C++11 이후)에 대해 다루고자 작성하게 되었습니다. 들어가기에 앞서 C++ 에 대해 간략히 짚고 넘어갈 것들이 있습니다. 프로그래밍을 처음 배울때, C++ 로 시작하는 것은 별로 추천하지 않습니다. 일단 바탕에 존재하는 문법은 C와 거의 동일합니다. 거기에 버전이 지나면서 다른것들이 추가되었지만, 기본적으로는 C 문법을 알아야 합니다. 그런데 C++ 이 지향하는 점은 C와 매우 다릅니다. 이 점을 무시하고 코드를 짜게되면 C++ 코드를 C 스타일로 짜게되는 매우 부적절한 현상이 생기게 되죠 그렇다고 C 문법을 배우지 말고 바로 C++ 스타일을 배워서 코드를 짜려니 포인터니 래퍼런스니 하는 개념들이 또 앞길..

C++ 2020.04.06