블로그
-
C++ ODR(단일 정의 규칙): 헤더 정의 링크 에러, inline·템플릿 예외, 링커가 못 잡는 위반
변수와 함수는 프로그램 전체에서 정의가 하나여야 한다는 ODR을 기준으로, 헤더에 함수를 정의해 생기는 링크 에러와 inline, 템플릿, constexpr 변수가 예외가 되는 이유, 번역 단위마다 정의가 달라 링커가 못 잡는 위반을 nm으로 확인하는 방법을 설명합니다.
-
C++ 연산자 오버로딩: 멤버·비멤버 선택, 산술·비교·입출력 연산자 구현
C++ 연산자 오버로딩으로 복소수, 분수, 행렬, 문자열 클래스에 산술·비교·입출력 연산자를 정의하는 방법을 정리합니다. 멤버·비멤버 선택, friend, 자기 대입, const 정확성 함정까지 다룹니다.
-
C++ 연산자 우선순위 함정: flags & MASK == 0 같은 비트·비교·논리 연산자 버그
flags & MASK == 0이 의도와 달리 비교부터 계산되는 것처럼 비트, 비교, 논리 연산자가 섞일 때 생기는 버그를 우선순위와 결합 방향 표로 풀어 봅니다. 증감 연산자, 대입과 비교 혼동, && 단축 평가를 예제로 보고 괄호를 어디에 치면 좋은지 정리합니다.
-
C++ Small String Optimization (SSO) | string 성능 최적화 원리
std::string이 짧은 문자열은 힙 할당 없이 객체 내부 버퍼에 저장하는 Small String Optimization의 구조를 설명하고, 주소 비교와 sizeof로 SSO 여부를 확인하는 법, 생성과 복사 벤치마크, 간단한 SSO 구현 예시를 다룹니다.
-
std::optional로 '값 없음' 표현하기: value_or, C++23 and_then·transform, 에러 처리 패턴
조회 실패나 파싱 실패처럼 값이 없을 수 있는 결과를 널 포인터나 -1 대신 std::optional로 표현하는 방법을 DB 조회, 설정 파싱, 캐시 예제로 보여주고, value_or와 C++23 and_then, transform, or_else로 검사 코드를 줄이는 법을 설명합니다.
-
C++ filesystem::path: 경로 결합·분해, absolute·canonical·relative 차이
std::filesystem::path의 / 연산자로 경로를 결합하고 filename, stem, extension으로 부분을 추출하는 법, absolute, canonical, relative의 차이, 확장자 일괄 변경과 백업 경로 생성 예제로 Windows와 Linux에서 같은 코드가 동작하게 만드는 방법을 다룹니다.
-
C++ 성능 최적화 순서: 복사 제거, 할당 줄이기, 캐시 지역성, 컴파일러 옵션
값 전달을 참조와 move로 바꾸고, reserve와 객체 풀로 할당을 줄이고, 데이터 지역성을 살려 캐시 미스를 줄이는 순서로 C++ 코드를 빠르게 만드는 방법을 설명합니다. 컴파일 옵션, 룩업 테이블, SIMD 예제와 gprof, Callgrind, perf 사용법도 담았습니다.
-
C++ 포인터 처음 배우기: &와 * 연산자, swap·배열 순회, 초보자가 하는 첫 실수
변수는 집, 주소는 집 주소라는 비유로 &와 * 연산자가 하는 일을 그림과 함께 설명하고, swap 함수와 배열 순회로 포인터를 직접 써 봅니다. 초기화하지 않은 포인터, 댕글링 포인터, new 후 delete 누락 같은 첫 실수도 짚습니다.
-
C++ 정책 기반 설계: 템플릿 매개변수로 동작을 컴파일 타임에 조합하기
C++ Policy-Based Design으로 템플릿 매개변수를 통해 컴파일 타임에 동작을 조합하는 방법을 정리합니다. 스마트 포인터, 로거, 컨테이너 성장 전략 예제와 인터페이스 불일치·복잡도 함정을 다룹니다.
-
C++ 가상 함수 현장 매뉴얼 | 설계·비용·override·실무 패턴 한글 정리
가상 함수를 언제 쓰고 언제 템플릿이나 variant로 대체할지, override/final로 시그니처 실수를 막는 법, NVI 관용구, 다형 호출 비용과 캐시 친화 설계, 자주 보이는 안티패턴을 정리합니다.