C++/Advanced C++ 42

[C++] Memory Pool

메모리 풀 구현 32/64/128/... 바이트 단위로 메모리를 미리 할당하여, 실제 할당할 때 해당 메모리를 사용함. 장점 메모리 단편화 문제를 완화 가능. 특히 사이즈가 큰 메모리를 할당할 때 적절한 위치의 페이지를 찾는 것이 시간이 소요될 수 있다. 단점 사용하지 않는 메모리를 미리 할당하여 사용하게 되는 낭비. 메모리 풀과 같이 특정 할당자(Allocator)를 사용한 경우, 메모리를 반납하여 재사용할 수 있도록 할당자를 통한 해제를 해야한다. std::shared_ptr의 생성자에는 해제자 deleter에 대한 인스턴스를 받아 해제를 제어할 수 있다. std::unique_ptr는 타입으로 선언하여 사용한다. 커스텀 deleter를 사용하는 경우 타입 이름이 지저분해질 수 있다. MemoryHe..

C++/Advanced C++ 2024.03.31

[Functional C++] 함수형 프로그래밍 (3) 파셜 어플리케이션과 커링

파셜 어플리케이션과 커링에 대해 알아본다. C++ 17 기준을 요한다. 파셜 어플리케이션 N개의 인자를 가진 함수에서 하나의 인자를 바인딩(결정)하여 N-1개의 인자를 가진 함수를 만들어내는 것. 두 개의 인자를 가지는 add 함수에 첫번째 함수 인자를 결정하여 increment 함수를 만든다. auto add = [](const int first, const int second) { return first + second; }; //auto increment = partialApplication(add, 1); // 위 코드는 다음과 동치이다. auto increment = [](const int second) { return 1 + second; }; C++ 파셜 어플리케이션 기존 함수를 재사용하는 ..

C++/Advanced C++ 2022.10.08

[Functional C++] 함수형 프로그래밍 (2) 합성 함수

람다로 표현할 수 있는 합성 함수를 알아본다. doctest 예시로 들 여러 함수에 대해 유닛 테스트를 수행할 수 있는 헤더만 존재하는 오픈 소스를 사용한다. https://github.com/doctest/doctest GitHub - doctest/doctest: The fastest feature-rich C++11/14/17/20 single-header testing framework The fastest feature-rich C++11/14/17/20 single-header testing framework - GitHub - doctest/doctest: The fastest feature-rich C++11/14/17/20 single-header testing framework gith..

C++/Advanced C++ 2022.10.04

[Functional C++] 함수형 프로그래밍 (1) 불변성과 순수 함수

C++으로 함수형 프로그래밍을 작성하는 방법을 알아본다. 함수형 프로그래밍이 필요한 이유 짝수의 합, 홀수의 합, 모든 합을 구하는 예시 프로그램 struct Sums { int evenSum; int oddSum; int totalSum; }; const Sums sums(const vector& numbers) { Sums theTotals; for (auto iter = numbers.begin(); iter != numbers.end(); ++iter){ int number = *iter; if (number % 2 == 0) theTotals.evenSum += number; if (number % 2 == 1) theTotals.oddSum += number; theTotals.totalSum..

C++/Advanced C++ 2022.10.03

[C++] Protobuf (Google Protocol Buffer) 라이브러리

Protobuf JSON과 같은 메시지 직렬화/역직렬화 라이브러리로 이진 데이터 직렬화로 효율적인 메모리 사용하고 빠른 메시지 파싱 및 다중 언어를 지원한다는 특징이 있다. 메시지의 프로토콜은 .proto 파일로 정의하여 protoc라는 실행 파일로 (cpp의 경우) .pb.h / pb.cc를 자동 생성한다. message Person { optional string name = 1; optional int32 id = 2; optional string email = 3; } Protobuf의 직렬화 원리 다음 글을 읽어보면 좋다. 기본적으로 Key-Value 쌍으로 이루어진 이진 데이터로 인코딩 되는데 https://medium.com/naver-cloud-platform/nbp-%EA%B8%B0%EC..

C++/Advanced C++ 2022.09.27

[C++] Redis 사용하기

C++ Redis 라이브러리를 사용해본다. Redis 데이터 베이스 서버에서 쿼리로 조회하는 것보다 캐시 서버(Redis)를 둬 I/O를 동반한 데이터 베이스 서버보다 빠르게 데이터를 가져오기 위해 사용한다. 기본적으로 key-value 쌍의 데이터를 저장한다. Redis 는 C언어로 작성된 hiredis 라이브러리를 의존하는 C++ 라이브러리를 사용할 예정이다. C hiredis https://github.com/redis/hiredis GitHub - redis/hiredis: Minimalistic C client for Redis >= 1.2 Minimalistic C client for Redis >= 1.2. Contribute to redis/hiredis development by crea..

C++/Advanced C++ 2022.08.18

[C++] CryptoPP 암호화/복호화 라이브러리

CryptoPP 라이브러리를 사용해본다. https://www.cryptopp.com/ Crypto++ Library 8.7 | Free C++ Class Library of Cryptographic Schemes hash functions BLAKE2b, BLAKE2s, Keccack (F1600), SHA-1, SHA-2, SHA-3, SHAKE (128/256), SipHash, LSH (128/256), Tiger, RIPEMD (128/160/256/320), SM3, WHIRLPOOL www.cryptopp.com SHA(Secure Hash Algorithm) 해시 함수 미 국가보안국(NSA)에서 개발한 암호화 해시 생성 알고리즘으로 Merkle–Damgård construction 에 기반..

C++/Advanced C++ 2022.08.11

[C++] SEHException : 구조적 예외 처리 Strucutred Exception Handling

Structured Exception Handling (SEH) 구조적 예외 처리 https://docs.microsoft.com/en-us/cpp/cpp/structured-exception-handling-c-cpp?view=msvc-170 C 언어에 대한 Microsoft 확장 표현으로 하드웨어 오류 같은 예외적인 상황을 잘 처리하기 위한 예외 처리 방법이다. 윈도우와 MicroSof에서 SEH를 지원한다 하더라도 ISO-표준 C++ 예외 핸들링 기법을 사용하는 것을 권장한다. 왜냐하면 표준 예외처리가 더 유연한 코드를 만들기 떄문이다. 문법 try-except 문법 __try { // compound-statement } __except (expression) { // compound-statem..

C++/Advanced C++ 2022.04.20

[C++] libcurl (3) 공개 API를 사용해보자 : HTTP POST

libcurl 라이브러리를 이용하여 HTTP POST 요청을 해본다. POST 요청의 경우 일반적으로 계정을 나타내는 Authentication 인증 정보를 헤더에 요구할 경우가 많다. 그 헤더 종류 중 하나가 Basic Authentication이 있다. "Authroization: Basic {username:password}" {username:password}: 해당 계정 이름과 비밀번호를 Base64 변환을 통해 얻은 스트링을 담아 보내게 된다. 두 필드는 ':'로 구분되어야 하기 때문에 username에는 ':' 가 없어야한다. HTTP POST 테스트 쉽게 HTTP POST를 테스트할 수 있는 사이트 중 다음을 이용해보도록 한다. https://reqbin.com/req/o3vugw0p/po..

C++/Advanced C++ 2022.04.18