전체 글 45

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 강좌 1강 - 출력(printf)

1. Hello, world! 선호하시는 편집기를 사용하여, main.c 라는 파일을 만들어 줍니다. [Windows 에서 C언어 컴파일하기 링크 이곳에] [MacOS 에서 C언어 컴파일하기 링크 이곳에] [Linux 계열에서 C언어 캄파일하기 링크 이곳에] 그리고 해당 파일에 아래 내용을 복사 & 붙여넣기 혹은 직접 타이핑을 해 봅시다. #include int main(){ // 헬로 월드 출력 printf("Hello, world!"); return 0; } 해당 코드를 컴파일 하고 실행하면, Hello, world! 라는 값이 화면에 나옵니다. 그럼 소스 코드를 하나 하나 뜯어볼까요? #include 이 문장의 의미는 stdio.h 라는 표준 파일 안의 내용을 여기에 붙여넣겠다는 뜻입니다. 컴파일을..

Android 에서 TensorFlow Lite 사용하기 (C/C++) - ( 2/2 )

Android 에서 TensorFlow Lite 사용하기 (C/C++) - ( 2/2 ) 1편: JNI 로 C++ 함수 호출하기 https://cppmagister.tistory.com/7 2편: Tensorflow Lite C++ 코드 연결하기 쓰다보니 내용이 상당히 많군요.. 이제 얼마 안남았으니 힘 내시길 바랍니다 ㅎㅎ 1. Tensorflow Lite C++ 연결 제가 편의를 위해 Tensorflow Lite C++ 라이브러리와 wrapper 를 미리 빌드해서 만들어놓은 repository가 있습니다(https://github.com/lackhole/Tensorflow-Lite) CPU, GPU, NNAPI 모두 가능하니 위 레포를 쓰는게 편하실겁니다 제가 주기적으로 업데이트를 하고 있으니, 원본..

C와 C++ 마스터 3: 구조체 ( struct )

1장과 2장을 통해, 기본 자료형들과 이들로 배열을 만드는 법을 알아보았습니다. 이번장에서는 여러 자료형을 담는 구조체에 대해서 알아보겠습니다. C 언어를 써 보셨던 분들도 모를 만한 내용들을 적어 두었기 때문에, 반드시 읽어 보시면 도움이 될 것 같습니다. 구조체 ( struct ) 목차 선언 초기화 메모리 C++ 에서 추가된 점 이제까지 배운 자료형들은 모두 같은 타입만 저장할 수 있었습니다. int는 정수 자료형 1개, int 배열은 정수자료형들만 저장할 수 있습니다. char*을 사용해 문자열을 이용한다면 숫자를 "100" 이런식으로 나타낼 수는 있겠지만, 만약 그 숫자가 3.14159265359.. 로 이어지는 유리수라면 문자열로 숫자를 저장 한다는것이 얼마나 비효율적인지 감이 오실겁니다. 그래..

C++ 을 위한 간략한 C 강좌 2 - 배열 및 포인터

기본 배열 (raw array)는 C++ 에서는 거의 지향하는 추세입니다. 아직도 성능 때문에 기본 배열을 쓰냐 std::array 를 쓰냐 싸운다던데, 그런 글들은 대부분 몇년 전의 글들이 대부분입니다. 예전의 C++ 에서면 몰라도, 현대의 C++ 컴파일러는 최적화를 매우 잘 해주기 때문에, 그래픽처럼 정말 최적화에 목숨을 걸 만한 상황이 아니면 std::vector 이나 std::array 를 무조건 쓰는 것이 권장됩니다. 그래도 가끔씩 쓸 일이 있기 때문에 간략하게 짚고 넘어가겠습니다. 목차 배열 포인터 요약 1. 배열 배열 선언은 간단합니다. 변수명 뒤의 대괄호에 배열 길이를 적어주면 됩니다. int arr[5] = {1, 2, 3, 4, 5}; 길이를 명시하지 않을 수 도 있습니다. 이때는 중괄..

C 2020.07.25