블로그
-
C++ Asio post, dispatch, defer | 실행 큐 정밀 제어 [#4]
Asio의 post는 항상 큐 뒤에 넣고, dispatch는 이미 해당 executor 안이면 즉시 실행하며, defer는 다음 턴으로 미룬다는 차이를 코드로 비교하고, 채팅 서버와 타이머·Strand 예제에서 어떤 것을 골라야 하는지 결정 기준을 제시합니다.
-
C++ 핸들러 메모리 최적화 | 동적 할당 오버헤드 제거 [#5]
Asio 비동기 연산마다 완료 핸들러 상태를 담으려고 동적 할당이 일어나는 이유와, associated_allocator와 bind_allocator로 커스텀 할당자를 연결하는 방법, 고정 블록 풀에 폴백을 둔 스레드 로컬 풀 할당자의 설계 포인트를 설명합니다.
-
C++ Asio Composed Operation | 비동기 함수 설계 [#7]
헤더를 읽고 길이만큼 바디를 읽는 두 단계 수신을 async_read_packet 하나로 묶는 Boost.Asio Composed Operation을 설계합니다. 상태 머신으로 비동기 호출을 연쇄하는 법과 async_initiate, 완료 토큰으로 콜백과 코루틴을 모두 지원하는 방법을 설명합니다.
-
C++ noexcept 지정자: 이동 생성자·swap·소멸자에 붙이는 이유와 위반 시 terminate
C++ noexcept 지정자로 함수가 예외를 던지지 않음을 명세하는 방법을 이동 생성자, swap, 소멸자, vector 최적화 예제로 정리합니다. 조건부 noexcept, noexcept 연산자, 위반 시 std::terminate 함정까지 다룹니다.
-
C++ nullptr vs NULL: NULL이 정수라서 생기는 오버로드·템플릿 버그
NULL이 사실상 정수 0이라서 int를 받는 오버로드와 섞이면 모호한 호출이나 의도와 다른 함수 선택이 생기고, 템플릿과 auto 추론에서는 포인터가 아닌 정수로 잡히는 문제를 보여줍니다. nullptr_t가 이를 막는 원리와 clang-tidy로 기존 코드를 옮기는 방법도 설명합니다.
-
C++ numeric_limits: 타입 최댓값·최솟값·NaN 조회와 오버플로우 검사
std::numeric_limits로 정수와 실수 타입의 최댓값, 최솟값, 정밀도, infinity와 NaN을 조회해 오버플로우 전에 덧셈을 검사하거나 안전하게 타입을 변환하는 방법을 다룹니다. 실수 타입에서 min()이 가장 작은 음수가 아니라는 함정도 설명합니다.
-
C++ 객체 풀 구현: RAII 반납 래퍼, 동적 확장, reset 누락과 스레드 안전
게임 오브젝트처럼 자주 생성되고 사라지는 객체를 미리 만들어 두고 재사용하는 Object Pool을 구현합니다. 반납을 자동화하는 RAII 래퍼, 부족할 때 늘리는 동적 확장, 타입별 풀 관리자를 만들고 reset 누락과 스레드 안전 문제를 짚습니다.
-
C++ 객체 슬라이싱: 파생 부분이 잘려 나가는 네 가지 경우와 다형성 지키는 법
파생 객체를 기반 클래스 값으로 넘기거나 반환하고, 대입하거나 vector에 담는 네 가지 경우에 파생 부분이 잘려 나가는 이유를 메모리 레이아웃으로 보여주고, 참조·포인터·스마트 포인터와 복사 방지로 다형성을 지키는 법을 설명합니다.
-
C++ Observer 패턴: weak_ptr로 구독자 수명 관리, 이벤트 타입별 알림, 신호/슬롯
C++ Observer 패턴으로 이벤트 기반 구조를 만드는 방법. 기본 구조, weak_ptr로 댕글링과 누수 방지, 이벤트 타입별 Observer, 신호/슬롯 패턴, 주식 시장 모니터 예제를 정리합니다.
-
C++ 관찰 포인터: 소유하지 않는 참조를 원시 포인터·weak_ptr로 표현하는 기준
소유하지 않고 가리키기만 하는 관찰 포인터를 부모-자식 관계, 콜백, 컨테이너 요소 접근, 이벤트 시스템에서 쓰는 방법과 원시 포인터, unique_ptr, weak_ptr 중 무엇으로 표현할지, 대상이 먼저 소멸해 생기는 댕글링을 막는 법을 다룹니다.