블로그
-
C++ std::string 자주 쓰는 함수 정리: 검색·치환·분할과 흔한 실수, 성능 팁
C++ std::string 사용법 정리. 생성과 연결, find·substr·replace 같은 자주 쓰는 함수, 문자열 분할 같은 실전 예시, 자주 생기는 문제와 성능 최적화 팁을 예제로 다룹니다.
-
C++20 stop_token·stop_source·stop_callback: jthread와 협력적 취소 구현
C++20 std::stop_token·stop_source·stop_callback과 std::jthread로 협력적 취소를 구현하는 방법입니다. 워커 루프, condition_variable_any 연동, 콜백 수명 주의점을 실전 코드와 함께 설명합니다.
-
C++ 스톱워치와 벤치마크 | chrono로 실행 시간 측정하기
외부 라이브러리 없이 <chrono>만으로 재사용 가능한 스톱워치 클래스와 스코프가 끝날 때 시간을 찍는 RAII 타이머를 만듭니다. 여러 번 측정해 평균·중앙값 등으로 해석하는 법, 컴파일러가 측정 대상 코드를 지워 버리는 문제를 막는 법도 다룹니다.
-
C++ Strategy 패턴: 다형성 vs 함수 포인터 vs 람다 vs std::function으로 알고리즘 교체하기
C++ Strategy 패턴으로 알고리즘을 캡슐화하고 런타임에 교체하는 방법. 다형성, 함수 포인터, 람다, std::function 네 가지 구현과 각각의 성능 특성, 압축 알고리즘 예제를 정리합니다.
-
C++17 shared_mutex: 읽기-쓰기 락으로 동시 읽기 허용하기와 쓰기 기아
읽기가 대부분인 캐시나 설정 관리자에서 std::mutex 대신 C++17 shared_mutex를 쓰면 shared_lock으로 여러 스레드가 동시에 읽을 수 있습니다. unique_lock과의 차이, 캐시·통계 수집기 예제, 쓰기 기아와 락 업그레이드 데드락을 다룹니다.
-
C++ static_assert: 타입 크기·템플릿 제약·구조체 레이아웃을 컴파일 시점에 검증하기
static_assert로 타입 크기, 템플릿 인자 제약, 플랫폼 조건, 구조체 레이아웃을 컴파일 시점에 검증하는 방법을 다룹니다. NDEBUG에 영향받는 assert와의 차이, 런타임 값을 넣었을 때의 에러, 템플릿에서 검사가 언제 일어나는지도 설명합니다.
-
C++ sregex_iterator·sregex_token_iterator: 모든 매치 순회와 문자열 분할
문자열 안의 모든 정규식 매치를 sregex_iterator로 순회하며 캡처 그룹을 꺼내고, sregex_token_iterator로 구분자 기준 분할을 하는 방법을 단어 추출, URL 파싱, 로그 파싱 예제로 보여줍니다. 임시 문자열 수명, 빈 매치, 성능 함정도 다룹니다.
-
C++ 반환 방식 고르기: 값·레퍼런스·포인터 반환, RVO를 막는 return std::move
함수에서 값, 레퍼런스, 포인터 중 무엇으로 반환할지 정하는 기준과 지역 변수 레퍼런스를 반환해 댕글링이 되는 문제, 일부 경로에서 return이 빠지는 실수, return std::move가 RVO를 막는 이유, pair·tuple·optional로 여러 값을 돌려주는 방법을 설명합니다.
-
C++20 counting_semaphore·binary_semaphore: 동시 사용 수 제한과 스레드 간 신호
C++20 counting_semaphore로 연결 풀이나 워커 슬롯의 동시 사용 수를 제한하고, binary_semaphore로 스레드 간 신호를 보내는 방법을 생산자-소비자 예제로 설명합니다. release 누락, 초기값 실수, try_acquire로 대기 없이 시도하는 법도 다룹니다.
-
C++ 정책 기반 설계: 템플릿 매개변수로 동작을 컴파일 타임에 조합하기
C++ Policy-Based Design으로 템플릿 매개변수를 통해 컴파일 타임에 동작을 조합하는 방법을 정리합니다. 스마트 포인터, 로거, 컨테이너 성장 전략 예제와 인터페이스 불일치·복잡도 함정을 다룹니다.