C++ 고급 문법 (6) — 명시적 캐스팅(Explicit Casting)

C 스타일 캐스트 (T)x는 무엇이든 통과시킨다. const를 떼는 것도, 전혀 관계없는 타입의 포인터로 바꾸는 것도 경고 없이 한 줄에 끝난다. 다중 상속이나 불완전 타입이 섞이면 같은 문법이 상황에 따라 다른…

Continue ReadingC++ 고급 문법 (6) — 명시적 캐스팅(Explicit Casting)

C++ 고급 문법 (5) — 임시 객체(Temporary Object)

const char* p = make_path().c_str(); 한 줄은 컴파일러 경고 없이 통과하고, 대개 출력도 멀쩡하게 나온다. 하지만 p가 가리키는 메모리는 이미 해제된 상태다. make_path()가 반환한 std::string은 이름 없는 임시 객체(temporary object)이고,…

Continue ReadingC++ 고급 문법 (5) — 임시 객체(Temporary Object)

C++ 고급 문법 (4) — 함수 객체(Function Object)

std::sort에 비교 함수를 넘기는 방법은 여러 가지다. 함수 포인터, operator()를 가진 클래스, 람다(lambda), std::function 중 무엇을 넘기든 결과는 같다. 그런데 천만 개를 정렬해 보면 실행 시간은 2배 가까이 벌어진다. 차이는…

Continue ReadingC++ 고급 문법 (4) — 함수 객체(Function Object)

C++ 고급 문법 (3) — inline 함수(Inline Function)

작은 함수를 헤더에 정의했더니 multiple definition 링크 에러가 나고, 앞에 inline을 붙이자 사라진다. 많은 교재는 inline을 "호출 대신 본문을 끼워 넣으라는 요청"으로 설명하지만, 현대 컴파일러에서 실제로 인라인 확장(inline expansion)을 할지는…

Continue ReadingC++ 고급 문법 (3) — inline 함수(Inline Function)

C++ 고급 문법 (2) — 함수 템플릿(Function Template)

지난 글에서 본 오버로딩으로 max를 만들면 int, double, std::string마다 본문이 똑같은 함수를 하나씩 복사해야 한다. 함수 템플릿(function template)은 타입을 매개변수로 받아 이 복사를 컴파일러에게 맡긴다. 대신 템플릿 인수 추론(template argument…

Continue ReadingC++ 고급 문법 (2) — 함수 템플릿(Function Template)

C++ 고급 문법 (1) — 함수 오버로딩(Function Overloading)

C에서는 정수를 출력하는 함수와 실수를 출력하는 함수를 print_int, print_double처럼 이름을 나눠 만들어야 한다. C++은 이름이 같고 매개변수 목록만 다른 함수를 여러 개 둘 수 있다. 이것이 함수 오버로딩(function overloading)이다. 편리하지만…

Continue ReadingC++ 고급 문법 (1) — 함수 오버로딩(Function Overloading)

UBSan으로 C 미정의 동작 런타임에 잡기 — gcc·clang 실측 비교

정수 오버플로나 배열 범위 밖 접근처럼 C의 미정의 동작(undefined behavior)은 대개 크래시 없이 조용히 지나간다. 컴파일 경고로 잡히는 것은 상수로 접근하는 뻔한 경우뿐이고, 인덱스나 시프트 값이 런타임에 결정되면 경고가 나오지…

Continue ReadingUBSan으로 C 미정의 동작 런타임에 잡기 — gcc·clang 실측 비교

C언어 strict aliasing과 restrict — gcc/clang 최적화를 어셈블리로 확인하기

-O0에서 잘 돌던 코드가 -O2로 올리면 값이 달라진다. 디버거로 들여다보면 메모리에는 올바른 값이 들어 있는데 함수가 엉뚱한 값을 반환한다. 대개 범인은 두 가지다. 서로 다른 타입의 포인터로 같은 메모리를 건드리는…

Continue ReadingC언어 strict aliasing과 restrict — gcc/clang 최적화를 어셈블리로 확인하기

Bash 리다이렉션과 파일 디스크립터 직접 다루기 — exec, 프로세스 치환, coproc

빌드 스크립트를 돌리면 로그는 파일에 남겨야 하는데 진행 상황은 화면으로 봐야 하고, 두 명령의 출력을 비교하려면 임시 파일을 두 개 만들어야 하고, while read로 센 개수가 루프를 벗어나면 0으로 돌아와…

Continue ReadingBash 리다이렉션과 파일 디스크립터 직접 다루기 — exec, 프로세스 치환, coproc