블로그
-
C++ 헤더 온리 라이브러리 만들기: inline·템플릿·constexpr과 ODR, multiple definition 피하기
구현을 헤더에 두면서도 multiple definition 링커 에러 없이 배포하려면 inline, 템플릿, constexpr가 ODR과 어떻게 맞물리는지 알아야 합니다. extern template로 인스턴스화를 줄이는 법과 컴파일 시간, ABI 관점의 비용도 짚습니다.
-
C++ undefined reference to vtable: 첫 비인라인 가상 함수 정의 누락과 해결
undefined reference to vtable 링커 에러는 대개 클래스의 첫 번째 비인라인 가상 함수나 소멸자의 정의가 빠졌을 때 납니다. vtable이 어느 번역 단위에 생성되는지부터 설명하고, .cpp 정의 추가, 인라인 정의, = default로 고치는 방법을 보여줍니다.
-
C++ 이름 은닉(Name Hiding): 파생 클래스에서 기반 오버로드가 안 보일 때 using 선언
파생 클래스에 같은 이름의 함수를 하나만 선언해도 기반 클래스의 오버로드 전체가 가려지는 이름 은닉의 원리를 설명하고, using 선언으로 되살리는 법과 오버로딩·오버라이딩·은닉의 차이를 생성자와 연산자 예시로 정리합니다.
-
C++ shared_ptr 순환 참조 누수: weak_ptr로 끊는 기준과 디버깅 방법
두 객체가 서로를 shared_ptr로 가리키면 참조 카운트가 0이 되지 않아 소멸자가 불리지 않습니다. 부모-자식 트리, 캐시, 옵저버에서 한쪽을 weak_ptr로 바꾸는 기준과 use_count(), Valgrind, AddressSanitizer로 누수를 확인하는 법을 다룹니다.
-
C++ 예외 처리: try/catch/throw, 예외 안전성, 언제 예외를 쓰나
예외를 던질지 에러 코드를 반환할지 결정하는 기준부터, 예외를 참조로 잡아야 하는 이유, 소멸자에서 던지면 안 되는 이유, RAII로 예외 안전성을 지키는 법, 스택 풀기와 noexcept의 실제 효과까지 C++ 예외 처리를 코드로 짚습니다.
-
C++ 예외 비용: Zero-Cost 모델의 의미, throw 비용, noexcept와 이동 생성자
C++ 예외의 Zero-Cost 모델이 실제로 무엇을 의미하는지, 정상 경로와 예외 경로의 비용 차이, noexcept가 이동 생성자 성능에 미치는 영향, 그리고 예외를 제어 흐름으로 남용했을 때의 실제 성능 손실을 벤치마크와 함께 정리합니다.
-
C++17 실행 정책 seq·par·par_unseq: 병렬 알고리즘과 데이터 레이스 함정
C++17 실행 정책으로 병렬 알고리즘을 구현하는 방법. seq, par, par_unseq 정책 비교, std::transform, std::sort 병렬화 실전 예제와 데이터 레이스·오버헤드 함정을 정리합니다.
-
C++23 std::expected: 예외 없이 에러 전달하기와 and_then 체이닝
C++23 std::expected로 값과 에러를 하나의 반환 타입에 담아, 예외 없이도 실패 이유를 호출자에게 전달하는 방법을 파일 읽기와 파이프라인 예제로 보여줍니다. and_then 체이닝, expected<void, E>, 예외와의 선택 기준도 다룹니다.
-
C++ explicit 키워드: 암시적 변환 막기, explicit operator bool, C++20 explicit(bool)
explicit를 붙이면 복사 초기화와 함수 인자에서 일어나던 암시적 변환이 막힙니다. 생성자와 변환 연산자, explicit operator bool, C++20 조건부 explicit(bool)의 동작을 비교하고, 스마트 포인터와 단위 타입에서 explicit를 쓰는 패턴을 정리합니다.
-
C++ Expression Templates: 벡터 연산의 임시 객체를 없애는 지연 평가 구현
a + b + c 같은 벡터 연산이 매 단계 임시 객체를 만드는 문제를 Expression Templates로 풀어, 연산을 식 트리로 쌓아 두었다가 대입 시점에 한 번의 루프로 평가하는 방법을 구현합니다. auto로 받았을 때의 댕글링과 앨리어싱 함정도 짚습니다.