블로그
-
C++ namespace 심화: using 선언 vs 지시문, 익명 namespace, 인라인 namespace, ADL
C++ namespace의 using 선언과 지시문 차이, 익명 namespace와 파일 범위 static 비교, 별칭, 인라인 namespace를 이용한 버전 관리, ADL과 swap 관용구, 헤더에서 피해야 할 패턴과 프로젝트 구조에 맞춘 배치를 설명합니다.
-
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++ 객체 슬라이싱: 파생 부분이 잘려 나가는 네 가지 경우와 다형성 지키는 법
파생 객체를 기반 클래스 값으로 넘기거나 반환하고, 대입하거나 vector에 담는 네 가지 경우에 파생 부분이 잘려 나가는 이유를 메모리 레이아웃으로 보여주고, 참조·포인터·스마트 포인터와 복사 방지로 다형성을 지키는 법을 설명합니다.
-
C++ 관찰 포인터: 소유하지 않는 참조를 원시 포인터·weak_ptr로 표현하는 기준
소유하지 않고 가리키기만 하는 관찰 포인터를 부모-자식 관계, 콜백, 컨테이너 요소 접근, 이벤트 시스템에서 쓰는 방법과 원시 포인터, unique_ptr, weak_ptr 중 무엇으로 표현할지, 대상이 먼저 소멸해 생기는 댕글링을 막는 법을 다룹니다.
-
C++ I/O 성능 최적화 | io_uring·mmap·DMA·제로카피 [#51-6]
read/write 루프가 병목일 때 io_uring 배치 제출, mmap 파일 매핑, sendfile·splice·copy_file_range 제로카피가 각각 어떤 비용(시스템 콜, 복사)을 줄이는지 Linux C++ 코드로 정리하고, SIGBUS·SQ 고갈·짧은 읽기 같은 함정을 다룹니다.
-
C++ 멀티스레딩 기초: std::thread·mutex·생산자-소비자와 자주 겪는 문제
std::thread 생성과 인자 전달, mutex와 lock_guard로 경쟁 조건 막기, 생산자-소비자와 스레드 풀 구현, 그리고 데드락, detach 후 댕글링 참조, false sharing처럼 멀티스레드 코드에서 자주 겪는 문제의 원인과 해결을 예제로 다룹니다.
-
C++ 프로젝트용 Makefile 작성: 변수, 패턴 규칙, 의존성 자동 생성, 병렬 빌드
Makefile은 Make가 사용하는 빌드 자동화 스크립트입니다. 컴파일과 링킹을 자동화하여 개발 생산성을 높입니다. 증분 빌드·병렬(make -j)은 CMake가 생성하는 Makefile/Ninja와도 같은 맥락입니다.