블로그
-
C++20 std::jthread: 자동 join과 stop_token으로 스레드 협조적 중단하기
C++20 std::jthread가 소멸 시 자동으로 join하는 방식과 stop_token·stop_source·stop_callback으로 스레드를 협조적으로 중단하는 방법을 std::thread와 비교하고, 중단 체크 누락이나 detach 같은 실수를 예제로 짚습니다.
-
C++ 힙 손상: 버퍼 오버플로우·이중 delete·use-after-free 원인과 ASan·Valgrind 탐지
C++ 힙 손상이 버퍼 오버플로우, 이중 delete, delete/delete[] 혼용, use-after-free로 발생하는 원리를 힙 메타데이터 구조로 설명합니다. AddressSanitizer·Valgrind 탐지법과 스마트 포인터·RAII 방지책까지 다룹니다.
-
C++17 if constexpr: 컴파일 타임 분기로 템플릿 단순화하기와 static_assert(false) 문제
if constexpr는 선택되지 않은 분기를 인스턴스화하지 않아 타입별 처리를 템플릿 하나로 쓸 수 있게 해 줍니다. 재귀 종료와 SFINAE 대체 예제, else에 static_assert(false)를 넣으면 생기는 문제, 분기마다 반환 타입이 달라지는 함정을 짚습니다.
-
C++ 조건문: if/else/switch 사용법과 흔한 실수
조건문을 처음 쓸 때 if-else if 사슬과 switch 중 무엇을 고를지, break를 빼먹어 다음 case로 흘러가는 fall-through, if (x = 5) 같은 대입 실수를 성적 계산기, ATM 메뉴, 윤년 판별 예제로 익히고 바로 고칠 수 있게 합니다.
-
C++ Include Path | 인클루드 경로 가이드
#include "file.h"와 #include <file.h>가 헤더를 찾는 순서의 차이, -I 옵션과 CMake target_include_directories로 경로를 추가하는 법, GCC/Clang에서 시스템 경로를 확인하는 명령, 같은 이름 헤더가 충돌할 때의 해결법을 예제로 설명합니다.
-
C++ 상속과 다형성: virtual 함수, 추상 클래스, 가상 소멸자 누락과 슬라이싱
C++의 상속(Inheritance)과 다형성(Polymorphism)을 게임 캐릭터·결제 시스템 예제로 정리합니다. virtual 함수, 순수 가상 함수, 가상 소멸자 누락과 슬라이싱 같은 실무에서 자주 겪는 함정을 다룹니다.
-
C++14 초기화 캡처: move 캡처와 unique_ptr을 람다에 넘기는 패턴
C++14부터 람다의 캡처 목록에 이름 = 표현식 형태를 쓸 수 있습니다. 이를 초기화 캡처(init-capture)라고 부릅니다. 클로저 객체 안에 지정한 이름의 멤버를 만들고, 오른쪽 표현식의 결과로 초기화합니다.
-
C++ 인라인 어셈블리: GCC 확장 asm 제약 문자·clobber, MSVC 차이, 인트린식이 나은 경우
GCC/Clang 확장 asm의 출력·입력 피연산자, 제약 문자, clobber 목록을 읽고 쓰는 법과 MSVC 문법의 차이, memory clobber로 컴파일러 배리어를 만드는 원리를 CPUID·타임스탬프 카운터 예제로 설명하고, 인트린식이 더 나은 경우를 구분합니다.
-
C++ inline의 진짜 의미: 인라인 확장이 아니라 ODR 예외, inline 변수와 constexpr
inline은 호출을 펼치라는 명령이 아니라 헤더에 정의를 두어도 링크 에러가 나지 않게 하는 ODR 예외입니다. 실제 인라인 확장은 컴파일러가 결정한다는 점, 큰 함수와 재귀·가상 함수의 한계, C++17 inline 변수와 constexpr의 관계를 예제로 봅니다.
-
C++ Flyweight 패턴: 공통 상태를 공유해 텍스트·타일·파티클 메모리 줄이기
C++ Flyweight 패턴으로 공통 상태(intrinsic)를 공유하고 개별 상태(extrinsic)만 따로 두어 메모리를 줄이는 방법. 텍스트 렌더링, 게임 타일, 파티클 시스템 예제와 캐시 수명·동시성 문제를 다룹니다.