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 최적화를 어셈블리로 확인하기

PLT 와 GOT – 리눅스 동적 링킹과 지연 바인딩

공유 라이브러리는 프로세스마다 다른 주소에 올라간다. ASLR이 켜져 있으면 같은 libc.so.6도 실행할 때마다 위치가 바뀐다. 그런데 .text는 읽기 전용으로 매핑되어 여러 프로세스가 물리 페이지를 공유하므로, call printf의 피연산자에 실제 주소를…

Continue ReadingPLT 와 GOT – 리눅스 동적 링킹과 지연 바인딩

C언어 전처리기 매크로 제대로 쓰기 — 괄호, do-while(0), #과 ##, X-macro, _Generic

매크로(macro)는 함수 호출 비용 없이 코드를 재사용하고, 타입에 상관없이 동작하는 코드를 만들 수 있어 C에서 자주 쓰인다. 문제는 전처리기가 문법을 이해하지 않고 토큰을 그대로 치환한다는 점이다. SQUARE(1 + 2)가 5가…

Continue ReadingC언어 전처리기 매크로 제대로 쓰기 — 괄호, do-while(0), #과 ##, X-macro, _Generic