Modern C++
-
RSA 인증Modern C++ 2020. 9. 6. 20:41
인증은 통신하려는 상대방이 신뢰할 수 있는 지를 확인하는 사용자 인증과 메시지의 내용을 누군가 바꿔치기 했는지를 확인하기 위한 메시지 인증으로 나눌 수 있다. 사용자 인증은 공개키 기반인 RSA를 이용한 디지털 서명 방식을 사용할 수 있다. 원리는 메시지의 해쉬 값에 인증서 발급자가 개인키를 통해 암호화하고 이를 수신하는 쪽은 해쉬 값을 공개키로 암호화를 해제해 해쉬함수를 통해 메시지의 무결성을 검사하는 방식으로 이루어 진다. 암호화된 해쉬 값을 디지털 서명 값이라고 하는 데 이 값은 오직 인증서 발급자의 개인키로만 암호화되고 이를 공개키를 통해서 확인 할 수 있기 때문에 이를 통해 인증서를 발행한 쪽에서 이 메시지를 전송했음을 신뢰할 수 있다. 물론 중간에 침입자가 자신이 만든 인증서를 상대방의 인증서..
-
구글 테스트 툴을 이용한 UnitTest용 CMakefileModern C++ 2020. 9. 6. 15:05
FetchContent는 Modern CMake에 추가된 기능으로 ExternalProject 를 통해서 이루어지던 방법들을 통해 외부 프로젝트를 설정 시간에 이동 시킬 수 있다. FetchContent를 사용하기 위해서는 include를 통해서 해당 모듈을 추가시키고 FetchContent_Declare를 통해 외부 프로젝트의 저장소를 정의 한다. FetchContent로 설정된 외부 프로젝트의 설정은 FetchContent_Populate()를 통해서 이루어 지고 해당 프로젝트를 add_subdirectory를 통해서 소스 디렉토리와 바이너리 디렉토리를 현재 프로젝트에 추가한다. #CMake 에서 FetchContent 모듈을 사용을 위해 include include(FetchContent) #외부 ..
-
packaged_task를 이용한 스레드 풀 구현 2Modern C++/Task 기반 비동기 프로그래밍 2020. 8. 28. 22:58
이전 장에 std::async 와 동일한 작업을 수행하는 함수를 구현해 보았다. 이제는 스레드에서 호출되는 람다를 queue에 저장하는 코드를 구현해 보자 2. queue 에 task 푸시 #include #include #include #include //람다 저장용 task_queue std::queue task_queue; #include template std::future async(Func&& func, Args... args) { using Result = std::result_of_t; //task 객체가 현재 범위를 벋어나면 사용 할 수 없으므로 동적으로 할당 auto task = new std::packaged_task( std::bind(std::forward(func), std::f..
-
packaged_task를 이용한 스레드 풀 구현 1Modern C++/Task 기반 비동기 프로그래밍 2020. 8. 28. 05:54
이전 장에서 std::async 함수를 통해서 비동기 태스크를 생성하는 방법과 내부에서 std::promise 와 std::future 객체를 통해서 스레드에서 어떻게 future 객체에 결과를 전달했는 지를 살펴 보았다. C++ 은 std::async 이외에도 packaged_task를 지원해 해당 태스크를 다른 스레드에 전달해 이를 수행할 수 있다. #include #include #include int add(int a, int b) { std::cout
-
왜 Task 기반의 비동기 프로그래밍인가?Modern C++/Task 기반 비동기 프로그래밍 2020. 8. 27. 21:18
개발을 시작할 때만 해도 C++에서 스레드를 지원하지 않아 이를 직접 개발해서 사용해 왔다. C++ 11 이 후에 스레드가 표준 라이브러리로 추가되었다. 하지만 C++ 도 자바나 Swift, Kotolin과 같이 스레드를 태스크 내부에 숨기고 태스크를 이용해 많은 부분 개발이 된다. 개발자는 더 이상 하드웨어 내 코어의 수에 따라 스레드를 관리하거나 스레드 풀을 구현하고 스레드가 데이터의 관리등을 위해 동기화 처리 문제등에서 조금은 벗어 날 수 있다. C++ 에서 비동기 프로그래밍을 위해서 스레드나 task를 사용한다는 사실은 ModernC++ 을 사용하는 사람은 대부분 알 수 있다. #include #include #include int main() { std::thread t([]() { for (s..
-
Lambda(람다)Modern C++/Lambda 2020. 7. 15. 02:52
1. Lamda Syntax Overview 람다는 클로져(closure)를 만들어내는 표현식(expression)으로 보통 람다 표현식 또는 람다 함수라고 부른다. 클로져는 범위 내 변수를 캡쳐 할 수 있는 이름없는 함수 객체이다. [] (int x, int y) -> int {return x + y; } //후행 반환 타입은 해당 람다의 본문의 반환 값을 통해서 추론 가능해 생략 가능하다. [] (int x, int y) { return x + y; } []() { std::cout int { return x * y; } captures : 외부 변수를 람다의 본문(body)에서 사용할 있게 캡쳐할 변수 목록 tparams : 템플릿 가변 인자 리스트 params : 함수 인자 목록 specifier..
-
스마트 포인터 참조 가이드(Smart Pointer Referece Guide)Modern C++/Smart Pointer 2020. 7. 12. 20:11
1. new를 이용한 동적 객체 생성은 피하되 필요한 경우 스마트 포인터를 사용하라. 스택을 사용하고 할당연산자나 이동/복사 연산을 사용하는게 객체의 수명 관리가 편해 코드가 어떻게 동작하는 지 예측하기 편하다. 동적 할당은 메모리를 힙에 할당하는 데 비용이 드는 것 뿐 만 아니라 메모리의 위치가 연속적이지 않아 컴파일러가 코드의 최적화를 수행하는 데 걸림돌이 되기도 한다. 메모리 할당은 필요할 때만 해야하고 new/delete를 직접 사용하지 않고 스마트 포인터를 사용하면 메모리를 직접 관리해야 하는 부담을 줄일 수 있다. 2. 스마트 포인터 선택 시 가장 먼저 std::unique_ptr 사용을 고려하라. 동적 메모리 할당이 필요한 경우 우선적으로 std::unique_ptr 사용을 고려한다. std..
-
2. std::shared_ptr 과 std::weak_ptrModern C++/Smart Pointer 2020. 7. 12. 17:07
std::shared_ptr 동적 할당된 객체의 소유권을 공유할 때 std::shared_ptr를 이용해 메모리를 관리한다. 메모리 해제 시점은 동적 객체를 가리키는 모든 공유 포인터가 더 이상 해당 객체를 가리키지 않을 때로 더 이상 공유 포인터가 가리키는 객체의 수명에 대해 신경 쓸 필요가 없어진다. 이렇게 메모리가 해제되는 시점은 원자적 참조 횟수(atomic reference count)를 통해 공유 포인터 생성 시 카운트를 증가시키고, 소멸 시 카운트를 감소시킨다. 복사 배정 연산자의 경우 증가와 감소가 모두 일어난다. 참조 횟수는 제어 블록(control block)에서 관리하며 공유 포인터의 대략적인 구조는 아래와 같다. 위와 같이 공유 포인터는 객체를 가리키는 포인터와 별개로 제어블록을 가..