부록 Q — 표와 그림 목록
이 책의 표와 그림을 번호순으로 모았다. 번호·제목·쪽 번호는 사람이 적은 것이 아니라 본문에서 그대로 뽑아낸 것이므로, 본문이 바뀌면 이 목록도 함께 바뀐다. PDF 에서는 번호를 누르면 그 표나 그림으로 뛴다.
표#
- 표 0.1 — 프로그래밍이 처음인 사람의 걸음
- 표 0.2 — 다시 배우는 사람이 먼저 볼 곳
- 표 2.1 — 자연수 기수의 표현 효율 비교
- 표 2.2 — 작은 수에서는 2진법이 이기기도 한다
- 표 2.3 — 기수가 커질수록 좁아지는 전압 준위 간격
- 표 2.4 — 무엇을 세느냐에 따라 갈리는 「가장 효율적인 기수」
- 표 4.1 — 널을 읽는 두 층 — 소스의 표기와 기억의 표현
- 표 5.1 — 기억의 네 구역과 그 성격
- 표 5.2 — 정적·스택·힙을 가르는 축들
- 표 5.3 — 이 장의 말과 표준의 말
- 표 5.4 — 이 밑그림이 통하지 않는 기계들
- 표 5.5 — 네 구역이 다시 돌아오는 자리
- 표 7.1 —
float과double의 비트 나누기 - 표 7.2 — 지수 비트가 전부 0 이거나 전부 1 일 때의 특별한 값들
- 표 7.3 — 같은 수의 64비트 내부 표현
- 표 8.1 — ASCII와 EBCDIC이 같은 글자에 준 번호
- 표 8.2 — EBCDIC 알파벳이 끊긴 자리와 그 사이에 앉은 문자
- 표 8.3 — 손으로 적은 문자 판정과 라이브러리에 물은 것
- 표 8.4 — UTF-8의 바이트 수별 비트 배치
- 표 8.5 — 표준이 문자 집합에 붙인 이름들
- 표 8.6 — 문자 집합이 바뀌는 번역 단계
- 표 8.7 — C23이 정리한 인코딩의 이름
- 표 8.8 — 문자열 리터럴의 접두어와 그 보장
- 표 10.1 — 운영체제가 프로세스에게 주는 것
- 표 10.2 — 프로세스가 놓이는 상태
- 표 10.3 — 기계의 두 모드 — 사용자 모드와 커널 모드
- 표 10.4 — 프로그램과 프로세스 — 기억할 것
- 표 11.1 — 「언제 끊을 것인가」의 후보들
- 표 11.2 — 일을 번갈아 하는 방식들
- 표 11.3 — 전환할 때 옮겨야 하는 것
- 표 11.4 — 시계 인터럽트가 하는 일
- 표 11.5 — 바이트 하나를 보내는 두 가지 방법
- 표 11.6 — 바깥의 일을 알아채는 두 가지 방법
- 표 11.7 — 인터럽트가 일어나는 차례
- 표 11.8 — 인터럽트가 여럿일 때 생기는 일
- 표 11.9 — 장치가 여는 창구들
- 표 11.10 — 인터럽트가 겹칠 때 코드가 쓰는 다섯 가지 방법
- 표 11.11 — 인터럽트와 멀티태스킹
- 표 11.12 — 도스 시절, 인터럽트가 하던 일
- 표 11.13 — 이 장의 개념이 이어지는 곳
- 표 12.1 — 기억의 사다리 — 층별 크기와 대기 시간
- 표 13.1 — 이 책이 말하는 회색지대와 그렇지 않은 것
- 표 13.2 — 회색지대 관행과 그것을 다루는 자리
- 표 13.3 — 회색지대를 피할 이유가 커지는 물음들
- 표 13.4 — 회색지대를 다루는 사다리
- 표 13.5 — C 표준이 정하지 않는 것과 다른 표준이 대신 하는 약속
- 표 13.6 — 회색지대를 쓸 때 남기는 기록
- 표 16.1 — 터미널과 셸 — 낱말 정리
- 표 16.2 — 플랫폼별 터미널(창)과 셸(일꾼)
- 표 16.3 — 지금 쓰는 셸을 확인하는 법
- 표 16.4 — 첫날에 쓰는 셸 명령
- 표 16.5 — 내가 만든 실행 파일을 실행하는 입력 — 상황별 예
- 표 16.6 — 명령줄 인자의 갈래
- 표 16.7 — 컴파일러별 첫 빌드 명령
- 표 16.8 — 세 컴파일러 견주기 — 쓰는 곳, 옵션 계통, C23 지원, 실행
- 표 17.1 — C 표준이 나눈 토큰의 다섯 갈래와 전처리 단계의 헤더 이름
- 표 18.1 — 설치 없이 쓰는 웹 도구
- 표 18.2 — 문자 집합을 정하는 컴파일러 옵션
- 표 18.3 — 옵션에 따라 달라지는 「가」의 바이트 — 실측
- 표 18.4 — 자주 쓰는 gdb 명령
- 표 19.1 — 이 장에 나오는 줄임말
- 표 19.2 — 벤더 성능 컴파일러의 지금
- 표 19.3 — Pelles C 를 두고 자주 오가는 말
- 표 19.4 — Win32 의 강점과 그 대가
- 표 19.5 — Pelles C 툴체인에 들어 있는 것
- 표 19.6 — 컴파일러 이름에 얽힌 사정
- 표 19.7 — 컴파일러별 공식 자료
- 표 19.8 — 이 장의 컴파일러 한 줄 정리
- 표 21.1 — 정수 상수를 적는 진법
- 표 21.2 — 정수 상수의 접미어
- 표 21.3 — C23 자리 구분자가 되는 자리와 안 되는 자리
- 표 21.4 — 문자 상수의 접두어와 타입
- 표 21.5 — 이스케이프의 갈래
- 표 21.6 — 부동소수점 상수의 접미어
- 표 21.7 — 문자열 리터럴의 접두어와 인코딩
- 표 21.8 — 상수처럼 보이는 것들의 정체
- 표 21.9 —
const int가 걸리는 자리 - 표 21.10 — 네 가지 「상수」와 그 결핍
- 표 21.11 —
constexpr를 쓸 수 있는 자리 - 표 21.12 — 값이 정확히 담기지 않을 때 두 컴파일러의 반응
- 표 23.1 — 서식 지정의 빈칸과 그 이름
- 표 23.2 — 첫날에 쓰는 서식
- 표 23.3 — 출력 함수 넷과 쓰는 자리
- 표 24.1 — 변수 하나가 갖는 것
- 표 25.1 —
inline함수를 두는 방식에 따른 링크 결과 —-O0과-O2 - 표 25.2 —
inline함수의 두 형태 — 정의와extern선언을 어디에 두는가 - 표 25.3 —
static이 아닌 인라인 정의에서 금지된 것과 그 까닭 - 표 26.1 —
fgets가 하는 약속 - 표 26.2 — 그릇 끝의 모습으로 읽는 입력의 결과
- 표 27.1 — 타입이 정하는 것
- 표 27.2 — 객체 타입과 함수 타입
- 표 27.3 — 불완전 타입이 못 하는 일
- 표 27.4 — 표준이 말하는 기본 타입
- 표 27.5 — 문자 타입 삼형제
- 표 27.6 — §6.7.3.1 의 타입 지정자 항목 — 한 항목에 적힌 철자는 같은 타입
- 표 27.7 — 표준이 묶어 부르는 타입의 이름
- 표 27.8 — 파생 타입 — 무엇에서 무엇이 나오는가
- 표 27.9 — 타입 한정자가 하는 약속
- 표 27.10 — 타입 한정자와 저장 클래스 지정자의 자리
- 표 27.11 —
const가 붙는 자리에 따라 달라지는 것 - 표 27.12 — 타입을 말하는 낱말과 그 모인 자리
- 표 27.13 —
<stdint.h>의 폭 타입 — 세 갈래와 포인터 담기 · 가장 넓은 타입 - 표 27.14 — 자리에 맞는 정수 타입 고르기
- 표 27.15 — 표준의 낱말과 정면으로 다루는 장
- 표 28.1 — 정수 타입이 보장하는 최소 범위와 한계 매크로
- 표 28.2 — 부동소수점 한계 매크로
- 표 28.3 — 접미어 없는 상수의 타입이 정해지는 순서
- 표 28.4 — 같은 값을 다르게 적었을 때의 실측 타입
- 표 28.5 — 정수 타입의 갈래 — 폭과 쓰임
- 표 29.1 — 산술 연산자가 피연산자에 거는 조건
- 표 29.2 — 시프트의 상황별 판정
- 표 33.1 — 루프 3형제 — 조건을 보는 자리와 최소 실행 횟수
- 표 33.2 — 불변식을 확인하는 세 조각
- 표 33.3 — 불변식을 실무에서 쓰는 네 가지 방식
- 표 33.4 — 불변식이 잡아 주는 문제
- 표 33.5 — 루프 변수를 선언한 자리에 따라 달라지는 수명
- 표 33.6 —
for첫 칸에 적을 수 있는 것 — 표준별·컴파일러별 - 표 33.7 — 조건 칸이 루프 변수를 건드릴 때
- 표 33.8 — 끝나지 않는 루프를 두고 컴파일러가 하는 일
- 표 33.9 — 루프를 겹칠 때 새로 생기는 실수
- 표 34.1 — 연산자의 갈래 한눈에
- 표 35.1 — 대입의 세 평가 사이의 순서 — 표준이 정한 관계
- 표 35.2 — 복합 대입에서 왼쪽이 평가되는 횟수
- 표 35.3 — 대입에 숨는 변환 — 경우별 판정
- 표 35.4 — 대입과 부수효과 — 기억할 것
- 표 36.1 — 객체·주소·포인터가 각각 무엇인가 — 이 절의 요약
- 표 36.2 — 객체인 것과 아닌 것
- 표 36.3 — 객체 하나에 따라붙는 것들
- 표 36.4 — 「포인터」라는 낱말의 세 가지 쓰임
- 표 36.5 —
size_t가 무엇인가 - 표 36.6 — 같은 수가 자리마다 다른 뜻이 된다
- 표 36.7 —
%p의 계약 — 표준이 정한 두 줄 - 표 36.8 —
%p에int *를 그대로 넘겼을 때 — 경고 옵션별로 - 표 36.9 —
%p와PRIxPTR의 쓰임 - 표 36.10 — 리눅스 커널
printk가 포인터를 찍는 지정자 - 표 37.1 — 널 포인터 상수로 인정되는 표기
- 표 37.2 — 널을 다루는 층과 그 약속
- 표 37.3 — 널을 두고 C 와 C++ 이 갈리는 자리
- 표 38.1 —
void *와char *계열의 특권 비교 - 표 38.2 — 출처 모델이 들어오면 갈리는 관용구
- 표 39.1 — 배열이 주는 것
- 표 39.2 — 정의의 낱말과 그것이 뜻하는 것
- 표 39.3 — 배열 초기화의 꼴과 규칙
- 표 39.4 — 배열 통째로는 안 되는 것
- 표 39.5 — 원소가 붙어 있다는 사실에서 따라 나오는 것
- 표 39.6 — 포인터 산술의 네 가지 꼴
- 표 39.7 — 포인터가 낄 수 있는 연산과 없는 연산
- 표 39.8 — 금지된 꼴에 대한 GCC 의 대답
- 표 39.9 — 포인터 곁의 세 정수 타입
- 표 39.10 — 포인터 산술이 허용되는 범위
- 표 39.11 — 배열에서 나는 사고의 다섯 갈래
- 표 39.12 — 초기화하지 않은 지역 배열을 읽을 때 — 누가 알아채는가
- 표 39.13 — 배열 사고를 막는 층
- 표 40.1 — 다차원 첨자식이 풀리는 단계
- 표 40.2 — 다차원 자료를 다루는 네 패턴
- 표 40.3 — 다차원 배열 — 기억할 것
- 표 41.1 — 배열과 포인터를 가르는 다섯 축
- 표 41.2 — 첨자 접근의 걸음 수 비교
- 표 41.3 — 선언이 어긋났을 때 벌어지는 일
- 표 41.4 — 배열이 포인터가 되는 세 규칙
- 표 41.5 — 무너지지 않는 자리
- 표 41.6 — 매개변수에서 한 겹만 바뀐다
- 표 41.7 — 같은 세 낱말, 두 가지 배치
- 표 41.8 — 무엇을 고치려는가에 따라 겹이 하나씩 는다
- 표 41.9 — 폭이 제각각인 2차원 배열을 함수에 넘기는 우회들
- 표 41.10 — 무너짐이 낳는 사고와 그 처방
- 표 41.11 — 자리에 맞는 배열/포인터 고르기
- 표 41.12 — 배열과 포인터 — 기억할 것
- 표 42.1 — 같은 합, 다른 순서
- 표 42.2 — 여러 겹을 한 번에 벗는 장치 — 언어별
- 표 42.3 — 다중 루프를 빠져나오는 세 가지 방법
- 표 42.4 —
goto를 쓸 때의 규율 - 표 42.5 — 매크로 몸통의 세 가지 꼴
- 표 42.6 — 루프의 관용구와 그 주의
- 표 43.1 — 문자열의 정의가 말하는 것
- 표 43.2 — 문자열 리터럴의 갈래와 크기
- 표 44.1 — 입력 함수별 성공을 아는 법과 걸리는 자리
- 표 45.1 — 표준이 나누는 네 축 — 저장 기간·유효범위·연결·저장 클래스 지정자
- 표 45.2 — 저장 기간 넷과 그 수명
- 표 45.3 — 유효범위의 갈래
- 표 45.4 — 연결의 세 갈래
- 표 45.5 — 저장 클래스 지정자 일곱
- 표 45.6 — 저장 클래스를 둘 적을 수 있는 세 자리 (C23)
- 표 45.7 — 구역별로 사는 것과 그 수명
- 표 46.1 — 소스에 적힌 크기와 수명으로는 안 되는 일
- 표 46.2 —
calloc이 약속하는 것과 하지 않는 것 - 표 46.3 —
malloc호출을 적는 세 표기 - 표 46.4 — 선언 없이 부를 때 컴파일러가 하는 말
- 표 46.5 — 할당에서 나오는 실수와 진단
- 표 46.6 — C++ 컴파일러가 같은 코드에 하는 말
- 표 47.1 — 구조체가 주는 것
- 표 47.2 — 정의의 낱말로 가른 배열·구조체·공용체
- 표 47.3 — 멤버 타입별로 기본 초기화가 채우는 값
- 표 47.4 — 유연 배열 멤버가 있는 구조체의 크기 셈 — 무엇을 묻느냐에 따라
sizeof와offsetof가 갈린다 - 표 47.5 — 유연 배열 멤버가 있는 구조체를 옮기는 세 가지 방법
- 표 48.1 — 꼬리 패딩을 만드는 두 요구
- 표 48.2 — 구조체를 넘기는 세 가지 방법과 그 비용
- 표 48.3 — 구조체를 통째로 내보낼 때의 문제
- 표 48.4 —
alignas의 두 꼴과 뜻 - 표 48.5 —
alignas를 붙일 수 없는 자리 - 표 48.6 — 배열을 구조체로 감싸 값으로 넘기면 쓸모 있는 자리
- 표 48.7 — 구조체를 부리는 법 — 기억할 것
- 표 49.1 — 타입 펀닝의 방법과 C 에서의 판정
- 표 49.2 — 비값 표현 — 어디서 생기고, 만지면 어떻게 되는가
- 표 49.3 — 공용체의 크기와 정렬 규칙
- 표 49.4 — 비트 필드에서 구현이 정하는 것
- 표 49.5 — 조합형 한글의 비트 배치
- 표 50.1 — 구조체의 기억 모양에 대해 표준이 약속하는 것과 하지 않는 것
- 표 50.2 — 바이트열을 받는 상대와 그 상대가 나와 다를 수 있는 점
- 표 50.3 — 직렬화를 피하는 길과 그 대가
- 표 50.4 — 바이트 순서를 바꾸는 세 갈래
- 표 50.5 — 이진 형식을 설계할 때의 원칙
- 표 50.6 — 역직렬화에서 나는 사고의 갈래
- 표 50.7 — 역직렬화를 지키는 구조
- 표 50.8 — 직렬화 — 한 줄씩
- 표 51.1 — 같은 자료를 늘어놓는 세 방법
- 표 51.2 — 코드가 주로 하는 일에 따라 고르는 배치
- 표 51.3 — 캐시에 유리한 자료 구조의 갈래
- 표 51.4 — 자료 배치 — 한 줄씩
- 표 52.1 — 수학의 수식과 C의 수식
- 표 52.2 — 수식이 하는 네 가지 일
- 표 52.3 — 부수효과의 네 갈래
- 표 52.4 — 수식이 가진 것
- 표 52.5 — 연산자 묶음별 결합 방향
- 표 52.6 — 우선순위 때문에 다르게 묶이는 자리
- 표 52.7 — 전위와 후위 증감의 차이
- 표 52.8 — 증감에서 값 계산과 저장의 순서를 정하는 표준의 문장
- 표 52.9 — 전위와 후위 증감이 낳는 기계어 — 최적화 수준별, x86-64 gcc 14 · clang 19
- 표 52.10 — 같은 코드에 대한 C 와 C++ 의 판정
- 표 52.11 — 후위 연산자의 계약
- 표 52.12 — 단항 연산자의 계약
- 표 52.13 — 산술 연산자(곱셈·나눗셈·나머지·덧셈·뺄셈)의 계약
- 표 52.14 — 시프트 연산자의 계약
- 표 52.15 — 관계·상등 연산자의 계약
- 표 52.16 — 비트·논리 연산자의 계약
- 표 52.17 — 그 밖의 연산자의 계약
- 표 52.18 — 두 평가 사이에 성립할 수 있는 세 관계
- 표 52.19 — 시퀀스 포인트의 전체 목록 (C23 부속서 C)
- 표 52.20 — 자주 보는 수식의 판정
- 표 52.21 — 두 컴파일러가 실제로 고른 순서 (x86-64,
-O2) - 표 52.22 — 연산자에서 정의되지 않은 동작이 되는 자리
- 표 52.23 — 미지정으로 남은 자리
- 표 52.24 — 구현이 정하는 자리
- 표 52.25 — 연산자처럼 보이지만 연산자가 아닌 것들
- 표 52.26 — 수식과 연산자 — 기억할 것
- 표 53.1 — 다섯 동작 표에서 쓰는 글자
- 표 53.2 — 비트 하나를 다루는 다섯 가지
- 표 53.3 — 마스크 세 가지
- 표 53.4 — 자주 쓰는 관용구
- 표 53.5 —
<stdbit.h>가 이름을 준 것들 (uc·us·ui·ul·ull꼬리가 붙은 판도 있다) - 표 53.6 — 비트를 다룰 때의 수칙
- 표 53.7 — 비트 연산 언저리의 사고
- 표 53.8 — 컴파일러가 이미 아는 것 — 이 기계에서 확인
- 표 53.9 — 비트 연산이 실제로 쓰이는 자리
- 표 54.1 —
float과double의 바닥 (비정규수 구간의 눈금은 가장 작은 비정규수와 같다) - 표 54.2 — 비정규수가 공격면이 되는 세 갈래
- 표 56.1 — 구현 정의 · 미지정 · 정의되지 않은 동작과 표준의 태도
- 표 56.2 — 소스 파일의 끝에 대해 표준이 요구하는 것과 어겼을 때
- 표 56.3 — 기묘한 UB 코드와 표준의 자리
- 표 56.4 — 「여기 오면 안 된다」를 적는 두 가지
- 표 57.1 — 객체가 가진 네 가지 약속과 그것을 어긴 사고
- 표 57.2 — 버퍼 오버플로의 갈래
- 표 57.3 — 버퍼 오버플로를 막는 층 — 위에서 아래로
- 표 57.4 — 메모리 쪽 규칙과 C23 의 자리
- 표 57.5 — 메모리 사고 도감 — 어긴 약속, 잡는 도구, 막는 설계
- 표 58.1 — 「누가, 언제 돌려주는가」에 대한 네 가지 답
- 표 58.2 — 자동 메모리 관리가 받아 가는 것
- 표 59.1 —
main의 형태와 지위 - 표 59.2 — 프로그램을 끝내는 방법
- 표 59.3 — 종료 상태의 값과 뜻
- 표 59.4 —
main의 세 얼굴 — 기억할 것 - 표 61.1 — 링크의 세 단계
- 표 61.2 — 빌드별 산출물 크기와 내용
- 표 61.3 — ABI 가 정하는 것
- 표 61.4 — 구조체를 돌려주는 두 가지 길 (x86-64 System V)
- 표 61.5 — 같은 64비트 기계, 다른 약속 — 데이터 모형별 타입 크기(바이트)
- 표 61.6 — 소스 호환인데 이진 호환이 아닌 변경들
- 표 61.7 — 링크가 쓰는 표와 간접의 모양
- 표 62.1 — 표준이 정한 네 가지 스코프
- 표 62.2 — 가림을 다루는 실무 규율
- 표 62.3 — 이름을 만드는 두 층의 규칙이 다르다
- 표 62.4 — 이름과 물건에 대한 세 가지 질문
- 표 63.1 — 네 이름 공간과 거기 사는 이름
- 표 63.2 — 이름을 정하는 세 축
- 표 63.3 — 이름 짓기 방침과 그 근거
- 표 63.4 — 가림을 잡는 옵션과 실측
- 표 63.5 — 예약된 이름의 범위
- 표 64.1 — 이름 충돌이 드러나는 때
- 표 64.2 — 실제 프로젝트의 접두어 규약
- 표 64.3 — 심볼 가시성을 다루는 플랫폼별 방법
- 표 64.4 — 함수 포인터 구조체 하나로 내보내기 — 얻는 것과 치르는 것
- 표 64.5 — 선언별 심볼 종류(
nm) - 표 64.6 —
using namespace를 쓰는 규약과 그 근거 - 표 64.7 — 소스의 이름과 링커가 보는 이름
- 표 64.8 — 이름을 두고 들일 습관
- 표 65.1 — 매크로를 쓸 때의 규칙
- 표 65.2 — 매크로 치환 규칙 넷 — 한국어 이름과 표준의 이름
- 표 65.3 —
STR_RAW(WIDTH)를 한 겹으로 펼치는 차례 - 표 65.4 —
STR(WIDTH)를 두 겹으로 펼치는 차례 - 표 65.5 —
glue(HIGH, LOW)를 펼치는 차례 - 표 65.6 —
xglue(HIGH, LOW)를 펼치는 차례 - 표 65.7 — 번역 여덟 단계 한눈에
- 표 66.1 — 한 이름의 세 자리
- 표 66.2 — 호출식의 피연산자
- 표 66.3 — 원형을 둘러싼 규칙의 변화
- 표 66.4 — 인자와 반환값에 붙는 조율
- 표 66.5 — 같은 소스, 다른 순서 — 이 기계에서 잰 것
- 표 66.6 — 호출 언저리의 순서 규칙
- 표 66.7 — 호출 한 번의 다섯 걸음
- 표 66.8 — 레지스터를 지키는 책임
- 표 66.9 — 데스크톱 기계의 네 호출 규약 — 이 기계의 컴파일러가 낸 것
- 표 66.10 — 32비트 윈도의 세 규약 —
int f(int,int)를 이 기계의 mingw 로 빌드해서 - 표 66.11 —
mix(1, 2, 3)의 인자가 여섯 기계에서 실려 가는 모습 - 표 66.12 — 구조체 하나를 넘기고 돌려줄 때 — 컴파일러가 낸 것
- 표 66.13 — 함수 포인터를 돌려주는
pick의 선언을 적는 세 가지 - 표 66.14 — 호출 언저리의 사고
- 표 67.1 — 가변 인자에서 값이 진급하는 모습
- 표 67.2 — 가변 인자 함수가 개수와 타입을 알아내는 세 길과 깨지는 방식
- 표 68.1 — 심볼 찾기 함수의 반환 타입 설계와 표준과의 관계
- 표 68.2 — 범용 함수 포인터 타입의 세 철자 — 왕복 · 호출 실수 · 경고
- 표 68.3 — 함수 포인터를 찍는 방법과 그 이식성
- 표 68.4 —
dladdr로 함수 이름을 찾아 본 결과 - 표 68.5 — 함수 포인터 — 기억할 것
- 표 69.1 — 판데르린던의 우선순위 규칙
- 표 69.2 —
const가 붙은 선언을 읽는 법 - 표 69.3 —
char *const *(*next)();를 지워 가며 읽는 과정 - 표 69.4 —
signal의 선언을 이어 읽는 과정 - 표 69.5 — 선언 읽기 — 기억할 것
- 표 70.1 — 객체 지향을 설명하는 네 낱말
- 표 70.2 — 객체 지향 언어가 해 주는 것과 C 에서 손으로 하는 것
- 표 70.3 — 객체를 이루는 세 덩어리
- 표 70.4 — 제11부의 여섯 장
- 표 70.5 — 객체 지향을 흉내 내기 — 한 줄씩
- 표 71.1 — 오버로딩과 재정의는 다른 것이다
- 표 71.2 — 판이 바뀌는 구조체를 다루는 길
- 표 71.3 — 객체 체계의 수명 규약
- 표 71.4 — 표를 짓는 법 — 한 줄씩
- 표 72.1 — 동적 표가 필요한 자리
- 표 72.2 — 표 포인터의 두 자리
- 표 72.3 — 동적 가상 테이블 — 한 줄씩
- 표 73.1 — 측정 출력의 열한 줄
- 표 73.2 —
shape_area를 부른 다섯 함수와 탈가상화 결과 — 두 컴파일러가 같았다 - 표 73.3 — 동적 표를 쓸 것인가 — 판단 표
- 표 73.4 — 간접 호출의 비용 — 한 줄씩
- 표 74.1 — GObject 의 구조
- 표 74.2 — 다중 메서드 — 두 인자의 종류로 함수를 고른다
- 표 74.3 — 이 부의 생각들과 그 처음
- 표 74.4 — C 로 지은 객체들 — 한 줄씩
- 표 75.1 — 객체 체계를 돕는 매크로
- 표 75.2 — SOLID 의 다섯 원칙과 그것이 C 에서 띠는 모양
- 표 75.3 — 요즘의 언어들이 택한 길
- 표 75.4 — 무엇을 쓸 것인가 — 판단 표
- 표 75.5 — 한계와 쓰지 않을 때 — 한 줄씩
- 표 76.1 — 표준 라이브러리의 갈래와 대표 헤더
- 표 76.2 — 데이터형별 출력 서식
- 표 76.3 — 데이터형별 입력 서식
- 표 77.1 — 자유 사용 구현이 반드시 갖춰야 하는 헤더
- 표 77.2 — 판별로 늘어난 헤더
- 표 77.3 — 표준 라이브러리 한눈에 보기 — 기억할 것
- 표 78.1 —
<stdio.h>함수의 성공과 실패 - 표 78.2 — 입력 스트림에
fflush를 하면 - 표 78.3 — 스트림을 다룰 때의 규칙
- 표 79.1 — 읽기 함수의 지위와 평가
- 표 79.2 — 파일을 다루는 나머지 함수와 조심할 것
- 표 79.3 — 하려는 일에 맞는 입출력 함수 고르기
- 표 80.1 — 문자열 복사 함수의 지위와 잘림
- 표 80.2 — 나머지 문자열·메모리 함수와 조심할 것
- 표 80.3 — 하려는 일에 맞는 문자열 함수 고르기
- 표 81.1 —
<stdlib.h>할당 함수의 계약과 함정 - 표 81.2 — 끝내는 방법별 정리 작업
- 표 81.3 — 하려는 일에 맞는
<stdlib.h>함수 - 표 82.1 —
<ctype.h>함수가 참을 돌려주는 자리 - 표 82.2 — 문자 분류를 쓸 때의 규칙
- 표 83.1 — 로케일이 바꾸는 것 — 한국과 독일
- 표 83.2 — 로케일 범주와 영향받는 함수
- 표 83.3 —
setlocale두 번째 인자의 뜻 - 표 83.4 — 로케일 이름의 자리와 그것을 정하는 것
- 표 83.5 — 로케일 표기의 근거가 되는 표준
- 표 83.6 — 로케일 환경 변수의 순위
- 표 83.7 — glibc 의 로케일 데이터 — 파일 · 명령 · 경로
- 표 83.8 — 로케일 ① — 기억할 것
- 표 84.1 —
struct lconv의 멤버 - 표 84.2 — 자리 묶음(
grouping) 원소의 값과 뜻 - 표 84.3 — 부호 위치 값의 뜻
- 표 84.4 —
$·+로1.25를 찍은 결과(표준의 표 일부) - 표 84.5 —
strftime서식의 부류와 성질 - 표 84.6 — 스레드마다 로케일을 따로 쓰는 수단(표준 밖)
- 표 84.7 — 하려는 일에 맞는 로케일 도구
- 표 84.8 — 로케일 ② — 기억할 것
- 표 85.1 —
wchar_t를 두고 표준이 정한 것과 아닌 것 - 표 85.2 — 와이드 문자 관련 매크로
- 표 85.3 — 문자 상수·문자열 리터럴의 다섯 표기 — 타입과 인코딩
- 표 85.4 —
MB_CUR_MAX와MB_LEN_MAX— 헤더와 뜻 - 표 85.5 — 멀티바이트 변환 함수의 층
- 표 85.6 —
mbrtowc반환값의 뜻 - 표 85.7 — 와이드 문자 ① — 기억할 것
- 표 86.1 — 플랫폼별 사실상의 인코딩
- 표 86.2 — 서러게이트 구역의 범위
- 표 86.3 — Windows API 접미사별 문자열 타입
- 표 86.4 — 리눅스 코드가
wchar_t대신 UTF-8 을 쓰는 이유 - 표 86.5 — 툴킷별 문자열 타입
- 표 86.6 — 스트림 방향의 상태와 뜻
- 표 86.7 — 와이드 문자 ② — 기억할 것
- 표 87.1 — 자리마다 무엇을 쓰는가
- 표 87.2 — UTF-8 의 성질과 그 덕
- 표 87.3 — 거절해야 할 바이트열
- 표 87.4 — 텍스트를 세는 층과 그 단위
- 표 87.5 — 유니코드 정규화 형태 넷
- 표 87.6 — 언어에 따라 달라지는 대소문자 변환
- 표 87.7 — 지역별 레거시 인코딩
- 표 87.8 — 레거시 인코딩의 후행 바이트 범위
- 표 87.9 — 유니코드를 다루는 수단
- 표 87.10 — 실무의 유니코드 — 기억할 것
- 표 88.1 —
<math.h>함수의 함정 - 표 88.2 — 상황에 맞는 수학 함수 고르기
- 표 89.1 —
<time.h>의 타입과 함수 - 표 89.2 —
strftime지정자 - 표 89.3 — C23 이
<time.h>에 보탠 것 - 표 89.4 — 하려는 일에 맞는 시간 함수
- 표 90.1 — 오류 번호를 문장으로 바꾸는 함수
- 표 90.2 — 진단 도구와 그 규칙
- 표 91.1 —
<signal.h>의 선언 - 표 91.2 —
signal의 인자와 반환값 - 표 91.3 — 표준 신호의 이름과 기본 동작
- 표 91.4 — 처리기 안에서 허용되는 것
- 표 91.5 —
volatile sig_atomic_t의 두 낱말이 막는 것 - 표 91.6 — 처리기가
malloc을 부르면 - 표 91.7 — 신호와
longjmp가 저장하고 되돌리는 것 - 표 91.8 — 표준
signal의 빈틈과sigaction - 표 91.9 —
struct sigaction의 멤버 - 표 91.10 —
sigaction깃발의 뜻 - 표 91.11 —
siginfo_t의 자주 쓰는 멤버 - 표 91.12 — 신호별 쓰임과 대표 사례
- 표 91.13 — 신호여야 했던 이유
- 표 91.14 — 신호 — 기억할 것
- 표 92.1 —
<setjmp.h>의 선언 - 표 92.2 —
setjmp가 돌려주는 값 - 표 92.3 —
setjmp가 허용되는 문맥 - 표 92.4 —
longjmp의 조건과 어겼을 때 - 표 92.5 — 점프 버퍼에 저장되는 것
- 표 92.6 — 점프 버퍼의 부분과 크기
- 표 92.7 —
longjmp뒤 변수의 값 - 표 92.8 —
volatile이 필요한 변수 - 표 92.9 —
volatile이 쓰이는 세 자리와 막는 것 - 표 92.10 —
setjmp/longjmp로 지어진 것들 - 표 92.11 — 잡아 둔 기억을 누가 푸는가
- 표 92.12 — 하려는 일에 권하는 방법
- 표 92.13 — 비지역 점프 — 기억할 것
- 표 93.1 — C99 가 더한 헤더와 오늘의 위치
- 표 93.2 — C11 이 더한 헤더와 오늘의 위치
- 표 93.3 — 표준의 판마다 대표 보탬과 실제 쓰임
- 표 94.1 —
<threads.h>함수 - 표 94.2 —
shared += 1이 실제로 하는 일 - 표 94.3 — 뮤텍스의 종류와 쓰는 자리
- 표 94.4 — 뮤텍스 함수
- 표 94.5 — 조건 변수 함수
- 표 94.6 — 갈래마다 따로인 저장소의 두 꼴
- 표 94.7 — 스레드 지역 저장 함수
- 표 94.8 — C11 스레드가 덜 쓰이는 이유
- 표 94.9 — C11·POSIX·Win32 스레드 API 대조
- 표 94.10 — 상황별 스레드 권고
- 표 95.1 —
volatile·_Atomic·뮤텍스가 주는 세 가지 보장 - 표 95.2 — 원자적 연산과 쓰는 자리
- 표 95.3 — CAS 는 기계마다 다른 방식으로 이뤄진다
- 표 95.4 — 같은 코드가 기계마다 다른 비용을 치른다 — 깃발을 세우는 자리
- 표 95.5 — 메모리 순서와 그 보장
- 표 95.6 — 상황에 권하는 동시성 도구
- 표 95.7 — 원자적 연산 — 기억할 것
- 표 96.1 — 넘침 검사 — 예전 관용구와 지금
- 표 96.2 — 넘침을 묻는 법 — 기억할 것
- 표 97.1 — 매크로에서 키워드가 된 이름들, 그리고 새 키워드
- 표 97.2 —
NULL과nullptr의 차이 - 표 97.3 — 표준이 정한 일곱 속성
- 표 97.4 — 매크로에서 키워드로 — 기억할 것
- 표 98.1 — 실행 파일 · 주소 공간의 구역과 권한
- 표 98.2 — 리눅스와 윈도우의 주소 공간 배치
- 표 98.3 — 임베디드 기계의 기억 배치
- 표 98.4 — 프로그램의 기억 배치 — 기억할 것
- 표 99.1 — glibc 할당자의 층
- 표 99.2 — 단편화를 완화하는 법
- 표 99.3 — 대안 할당자와 그 성격
- 표 99.4 — 대안 표준 라이브러리 구현
- 표 99.5 — 할당자의 속 — 기억할 것
- 표 100.1 — 다섯 버그와 하나 더 — C가 주는 것과 필요한 것
- 표 101.1 — proven 이 하지 않는 것
- 표 101.2 — proven 이름의 꼴과 뜻
- 표 101.3 — proven 시작하기 — 빌드, 세 규칙, 첫 출력
- 표 102.1 — 에러 코드와 그 뜻
- 표 102.2 — 결과 꾸러미의 타입
- 표 102.3 — 상황별 오류 처리
- 표 103.1 — 기억을 가리키는 세 타입의 소유와 쓰기
- 표 103.2 — 자르기 함수 넷이 돌려주는 것 — 읽기/쓰기 × 검사/무검사
- 표 103.3 — 정렬 연산과 상수의 이름
- 표 103.4 — 이 장의 어휘와 계약
- 표 104.1 — 아레나의 한살이 — 네 걸음
- 표 104.2 — 아레나 할당 함수를 쓰는 자리
- 표 104.3 — 힙·아레나·풀 비교
- 표 104.4 — 상황에 맞는 할당자 고르기
- 표 105.1 — 문자열 함수의 할당과 파괴
- 표 105.2 — 문자열 연산의 세 갈래와 실패 원자성
- 표 105.3 — 문자열을 고치는 함수의 계약
- 표 105.4 — 텍스트 함수의 실패와 소유
- 표 106.1 — 형식화 자리에 쓸 수 있는 것
- 표 106.2 — 형식화 함수와 할당자
- 표 106.3 — 파싱 함수가 읽고 돌려주는 것
- 표 106.4 — 형식화와 스캐너 API
- 표 107.1 — 컨테이너별 만들기·할당·훑기·되돌리기
- 표 107.2 — 리스트를 훑는 매크로
- 표 107.3 — 맵을 만들 때의 키와 주의
- 표 107.4 — 컨테이너·알고리즘 도구와 맞는 자리
- 표 108.1 — 파일을 다루는 걸음
- 표 108.2 — 파일 깃발의 뜻
- 표 108.3 — 파일을 통째로 읽고 쓰는 함수와 주의
- 표 108.4 — 바깥 세계의 API와 조심할 것
- 표 109.1 — proven — 이 책이 확인한 것과 아닌 것
- 표 109.2 — 다섯 버그와 그 밖의 문제 — 답과 그 장
- 표 110.1 — 간이 JSON — 담는 것과 빼는 것
- 표 110.2 — 코드에 적힌 것과 적히지 않은 것
- 표 110.3 — 같은 자리를 순수 C 와 proven 으로
- 표 110.4 — 도구가 맡은 일과, 그 도구를 안 썼다면 생길 일
- 표 110.5 — 세 판으로 짜 보기 — 기억할 것
- 표 111.1 — 실무의 도구
- 표 111.2 — 프로파일러가 재는 것
- 표 111.3 — 대표 C 프로젝트와 C인 이유
- 표 111.4 — MISRA C 가 걸어온 길
- 표 111.5 — MISRA C 규칙 등급의 뜻
- 표 111.6 — 안전 규격과 코딩 규칙, 그 소관
- 표 111.7 — 규약이 자주 금지하는 것과 이 책의 자리
- 표 111.8 — C 와 C++ 이 서로 갖지 못한 것
- 표 112.1 — 빌드가 대신해 주는 일
- 표 112.2 — 헤더에 둘 것과 두지 않을 것
- 표 112.3 — 흔한 폴더 갈래와 그 이유
- 표 112.4 — 시험의 갈래와 각각이 잡는 것
- 표 112.5 — 기계에 맡길 것과 사람이 볼 것
- 표 112.6 — 무엇이 어떤 물음에 답하는가
- 표 112.7 — 빌드와 시험 — 기억할 것
- 표 113.1 — 이 장의 낱말
- 표 113.2 — 골든 시연에서 무엇이 픽스처였나
- 표 113.3 — 픽스처로 삼으면 안 되는 것
- 표 113.4 — 음성 검사로 드러나는 것
- 표 113.5 — 래칫이 있을 때와 없을 때
- 표 113.6 — 검사 깊이(티어)를 나누는 예
- 표 113.7 — 한 건의 일이 지나는 걸음
- 표 113.8 — 조용한 실패의 얼굴들
- 표 113.9 — 일이 굴러가는 방식 — 기억할 것
- 표 114.1 — 임베디드 컴파일러와 겨냥하는 칩
- 표 114.2 — 임베디드 작업별 도구
- 표 115.1 — C23 의 것 — 처음 만난 곳
- 표 115.1 — 우선순위 순으로 늘어놓은 연산자 묶음과 결합 방향(위가 강하다)
- 표 115.2 — 우선순위 때문에 의도와 다르게 묶이는 식
- 표 115.3 — 찾는 것이 있는 자리
- 표 115.1 — 출력과 입력 서식의 뼈대
- 표 115.2 — 출력 변환 전체 목록
- 표 115.3 — 플래그·폭·정밀도의 자리
- 표 115.4 — 길이 수식어
- 표 115.5 — 입력 변환 전체 목록
- 표 115.6 — 서식 함수와 줄 입출력 함수의 반환값
- 표 115.7 — 자주 하는 서식 실수와 고침
- 표 115.1 — 변환별 위험
- 표 115.1 — 요람의 열이 뜻하는 것
- 표 115.2 —
<string.h>요람 — 기억 블록 (mem*) - 표 115.3 —
<string.h>요람 — 복사와 이어 붙이기 - 표 115.4 —
<string.h>요람 — 견주기와 길이 - 표 115.5 —
<string.h>요람 — 찾기와 쪼개기 - 표 115.6 —
<string.h>요람 — 오류 문자열 - 표 115.7 —
<string.h>의 매크로와 타입 - 표 115.8 —
<ctype.h>의 모든 함수에 공통인 것 - 표 115.9 —
<ctype.h>요람 - 표 115.10 —
<stdckdint.h>요람 - 표 115.11 —
ckd_매크로의 공통 규약 - 표 115.12 —
<assert.h>요람 - 표 115.13 —
<errno.h>요람 - 표 115.14 —
<setjmp.h>요람 - 표 115.15 —
<stdarg.h>요람 - 표 115.16 —
<stddef.h>요람 - 표 115.17 — 빈 헤더가 된 사정
- 표 115.18 —
<iso646.h>가 주는 열한 이름 - 표 115.19 —
<limits.h>의 이름을 읽는 규칙 - 표 115.20 —
<limits.h>요람 - 표 115.21 — 타입에 딸리지 않은 셋
- 표 115.22 — 접미사가 뜻하는 것 — 세 접두에 모두 붙는다
- 표 115.23 — 타입에 딸리지 않은 이름들
- 표 115.24 — 세 갈래 — 무엇을 약속하는가
- 표 115.25 —
<stdint.h>요람 - 표 115.26 — 다른 헤더의 타입에 딸린 한계
- 표 115.27 —
<inttypes.h>요람 - 표 115.28 — 형식 매크로를 읽는 규칙
- 표 115.29 —
<stdbit.h>요람 — 타입 제네릭 이름으로 적는다 - 표 115.30 —
<locale.h>요람 - 표 115.31 —
<wctype.h>요람 - 표 115.32 —
<uchar.h>요람 - 표 115.33 —
<signal.h>요람 - 표 115.34 — 예외 깃발과 반올림 방향
- 표 115.35 —
<fenv.h>요람 - 표 115.36 — 무엇을 골라 주는가
- 표 115.37 — 복소수 값을 뜯어 보고 다루는 여섯
- 표 115.38 —
<math.h>와 짝을 이루는 것들 - 표 115.39 — 값을 만들고 계산을 고르는 것들
- 표 115.40 — 스레드 그 자체 —
thrd_ - 표 115.41 — 동기화 —
mtx_·cnd_·call_once - 표 115.42 — 스레드마다 따로인 저장소와 타입들
- 표 115.43 —
<stdatomic.h>의 연산 - 표 115.44 — 타입 이름 —
atomic_을 붙인 것들 - 표 115.45 — 문자열과 기억 —
<string.h>의 짝 - 표 115.46 — 변환 — 바이트와 와이드 사이, 그리고 수로
- 표 115.47 — 입출력 —
<stdio.h>의 짝 - 표 115.48 — 타입 · 매크로 · 부속서 K
- 표 115.49 —
<time.h>요람 - 표 115.50 — 타입과 매크로
- 표 115.51 —
<stdlib.h>요람 — 기억 할당 - 표 115.52 —
<stdlib.h>요람 — 프로그램의 끝 - 표 115.53 —
<stdlib.h>요람 — 문자열과 수 사이 - 표 115.54 —
<stdlib.h>요람 — 셈 · 정렬 · 난수 · 멀티바이트 - 표 115.55 — 부속서 K 의 제약 처리기와 다른 헤더에서 온 이름
- 표 115.56 —
<stdio.h>요람 — 열고 닫고 버퍼 - 표 115.57 —
<stdio.h>요람 — 읽고 쓰기 - 표 115.58 —
<stdio.h>요람 — 자리와 상태 - 표 115.59 — 매크로 · 타입 · 부속서 K
- 표 115.60 —
<math.h>의 이름을 읽는 규칙 - 표 115.61 — 값이 무엇인지 묻기 — 매크로다
- 표 115.62 — 초등 함수
- 표 115.63 — 반올림 · 나머지 · 자리 옮기기
- 표 115.64 — 정밀도를 지키는 셈 — 넓은 타입으로 한 번에
- 표 115.65 — 십진 부동소수점 전용
- 표 115.66 —
<math.h>의 나머지 매크로와 타입 - 표 115.1 — EBNF 표기와 뜻
- 표 115.2 — C 표준이 문법을 적는 규약
- 표 115.3 — 문법이 정하는 것과 그 밖
- 표 115.4 — 문법 — 기억할 것
- 표 115.1 — C23 이 언어에서 바꾼 것
- 표 115.2 — C23 이 전처리기에 보탠 것
- 표 115.3 — C23 이 라이브러리에서 바꾼 것
- 표 115.1 — 덤프에 담기는 것과 담기지 않는 것
- 표 115.2 — 코어 파일의 프로그램 헤더
- 표 115.3 — 주소를 이름으로 바꾸는 세 층
- 표 115.4 — 덤프가 안 남는 흔한 이유
- 표 115.1 — 운영체제가 해 주던 일, 그리고 OS 없는 기계에서 누가 하는가
- 표 115.2 — 인터럽트·예외·트랩 — 셋을 가르는 축
- 표 115.3 — 인터럽트가 왔을 때 무엇을 누가 저장하는가
- 표 115.4 — 같은 주소를 만져도 — 기억일 때와 장치일 때
- 표 115.5 — 장치에 닿는 두 가지 설계
- 표 115.6 — 옛 코드에서 그대로 만나는 고전적 포트 자리
- 표 115.7 —
volatile이 해 주는 것과 해 주지 않는 것 - 표 115.8 — 임베디드가
malloc을 쓰지 않기로 하는 세 이유 - 표 115.9 — 다녀온 뒤에 다시 읽는 앞 장들
- 표 115.1 — 이 부록에서 쓰는 낱말
- 표 115.2 — 연결을 가르는 네 축
- 표 115.3 — 이 부록에서 다루는 연결들
- 표 115.4 — 8N1 프레임의 열 비트
- 표 115.5 —
8N1같은 표기 읽는 법 - 표 115.6 — TTL 수준 UART 와 RS-232
- 표 115.7 — RS-232 의 신호선(9핀 기준)
- 표 115.8 — 흐름 제어의 두 방식
- 표 115.9 — UART 상태 레지스터에서 만나는 오류
- 표 115.10 — 병렬(센트로닉스) 포트의 신호들
- 표 115.11 — 빨라질수록 병렬이 지는 이유
- 표 115.12 — I2C 의 신호와 표시
- 표 115.13 — I2C 의 속도 모드
- 표 115.14 — SPI 의 네 선
- 표 115.15 — SPI 의 네 모드
- 표 115.16 — I2C 와 SPI 를 견주면
- 표 115.17 — 특이한 두 연결 방식
- 표 115.18 — PCI 와 PCI Express
- 표 115.19 — PCIe 세대와 실효 속도(레인 하나 기준)
- 표 115.20 — PCI 설정 공간 머리말(종류 0)의 주요 필드
- 표 115.21 — BAR 의 낮은 비트가 종류를 말한다
- 표 115.22 — USB 속도 등급
- 표 115.23 — USB 의 전송 네 가지
- 표 115.24 — 에지 방식과 레벨 방식
- 표 115.25 — 끼어들기를 전달하는 방식의 변천
- 표 115.26 — DMA 가 버스를 쓰는 방식
- 표 115.27 — DMA 를 쓸 때 걸리는 세 가지
- 표 115.28 — 폴링·인터럽트·DMA 를 한눈에
- 표 115.1 — 이 부록에서 쓰는 낱말
- 표 115.2 — 섹터 크기의 세 갈래
- 표 115.3 — MBR 512바이트의 전체 자리
- 표 115.4 — MBR 파티션 항목 16바이트
- 표 115.5 — CHS 3바이트의 비트 배치
- 표 115.6 — 자주 보는 파티션 종류 바이트
- 표 115.7 — EBR 의 두 항목 — 기준이 다르다
- 표 115.8 — MBR 과 GPT
- 표 115.9 — GPT 헤더의 전체 필드 (LBA 1, 92바이트)
- 표 115.10 — GPT 파티션 항목의 전체 필드 (128바이트)
- 표 115.11 — GPT 속성 비트 가운데 알아 둘 것
- 표 115.12 — GUID 의 다섯 마디와 저장 차례
- 표 115.13 — 자주 보는 종류 GUID
- 표 115.14 — 1 MiB 정렬이 맞춰 주는 것들
- 표 115.15 — 파일 시스템의 「자기 설명서」가 있는 자리
- 표 115.16 — FAT32 부트 섹터(BPB)의 주요 필드
- 표 115.17 — FAT32 의 항목 값(아래 28비트만 쓴다)
- 표 115.18 — ext4 슈퍼블록의 주요 필드 (파티션 시작 + 1024바이트)
- 표 115.19 — NTFS 부트 섹터의 주요 필드
- 표 115.20 — 자주 만나는 파일 시스템
- 표 115.21 — 하드디스크에서 한 번 읽는 데 드는 시간
- 표 115.22 — SSD 안의 세 가지 단위
- 표 115.23 — 「덮어쓸 수 없다」가 낳는 것들
- 표 115.24 — 기억 사다리의 아래층 (이 기계에서 잰 값)
- 표 115.25 — 이 층에서 나오는 설계 지침
- 표 115.26 — 증상 → 어느 층이 상했나
- 표 115.1 — 실행 파일 형식이 답해야 하는 네 가지
- 표 115.2 — PE 에서 알아 둘 세 가지
- 표 115.3 — 앞머리 몇 바이트로 알아보는 형식들
- 표 115.1 — 펌웨어가 하는 일
- 표 115.2 — MBR 512바이트의 자리 나눔
- 표 115.3 — BIOS 방식과 UEFI 방식
- 표 115.4 — 흔히 만나는 부트로더
- 표 115.5 — GRUB(옛 BIOS 방식)의 단계
- 표 115.6 —
core.img가 사는 자리 - 표 115.7 — UEFI 펌웨어가 다음 것을 찾는 순서
- 표 115.8 — 보안 부팅이 켜져 있을 때 리눅스가 뜨는 길
- 표 115.9 — U-Boot 계열의 단계
- 표 115.10 — MCUboot 가 갱신을 안전하게 만드는 방법
- 표 115.11 — 단계가 바뀔 때 넘어가는 것
- 표 115.12 — 증상 → 사슬의 어느 칸이 문제인가
- 표 115.13 — 윈도우의 부팅 사슬
- 표 115.1 — C 와 POSIX 에서 만나는 시계들
- 표 115.2 — 이 부록을 쓴 기계와 ARM 폰의 숫자 (예제가 읽은 값)
- 표 115.3 — 무엇을 어떻게 재나 — 크기에 따라 방법이 다르다
- 표 115.4 — 어떤 대표값을 쓸 것인가
- 표 115.5 — 측정의 여섯 규율
- 표 115.6 — 사다리의 각 칸이 하는 일
- 표 115.7 — 포인터 추적이 하는 일
- 표 115.8 — 이 측정에서 나오는 설계 지침
- 표 115.9 — 「줄 단위」가 만드는 네 가지 결과
- 표 115.10 — 같은 계산, 다른 배치
- 표 115.11 — 배치를 고르는 기준
- 표 115.12 — 주소 번역의 세 경우
- 표 115.13 — 쪽 수에 따른 한 번당 비용 (이 기계와 ARM 폰에서 잰 값)
- 표 115.14 — 첫 접촉 비용이 실제로 문제가 되는 자리
- 표 115.15 — 같은 소스, 다른 코드 — 원소당 시간 (이 기계에서 잰 값)
- 표 115.16 — 패턴에 따른 비용 (진짜 분기를 남긴 코드)
- 표 115.17 — 이 측정에서 나오는 지침
- 표 115.18 — 코어가 캐시 줄을 다루는 규약(대략)
- 표 115.19 — 두 스레드가 각자 제 칸(스레드마다 하나씩 둔
long변수)의 값을 올릴 때 (이 기계와 ARM 폰에서 잰 값) - 표 115.20 — 거짓 공유를 피하는 방법
- 표 115.21 — 함께 쓰기의 비용 (이 기계와 ARM 폰에서 잰 값)
- 표 115.22 — 값의 크기만 바꿨을 때 (이 기계에서 잰 값)
- 표 115.23 —
float와double— 벡터 명령을 쓸 때와 안 쓸 때 - 표 115.24 — 연산별 비용 (L1 안의 자료, 이 기계에서 잰 값)
- 표 115.25 — 이 측정에서 나오는 요령
- 표 115.26 — 이 부록에서 잰 값 모음 (이 기계와 ARM 폰, 중앙값)
- 표 115.27 — ARM 폰의 지연 곡선 (무작위 접근, 다섯 번의 중앙값, 코어 묶음마다 4 KiB 대비)
- 표 115.28 — 증상 → 먼저 의심할 자리
- 표 115.1 — 기억을 다스리는 세 갈래
- 표 115.2 — 쪽 표의 층과 쪽 크기 — RISC-V 의 두 방식
- 표 115.3 — 주소를 번역하지 않는 기계에서 달라지는 것
- 표 115.4 — 주소 공간이 하나가 아닌 기계들
- 표 115.5 — DMA 와 캐시가 어긋날 때
- 표 115.1 — 표준 C 에 없는 것
- 표 115.2 — 표준 C 만으로 끝낼 수 있는 것
- 표 115.3 — 간극을 두고 흔히 하는 생각과 실제
- 표 115.4 — C 다음에 갈 수 있는 길
- 표 115.5 — C 로 창을 띄우는 길
- 표 115.6 — 끝까지 만들어 볼 만한 것들
- 표 115.7 — C 를 더 보는 자리
- 표 115.8 — 강의와 커리큘럼
- 표 115.9 — 무엇이 있는지 훑는 자리
- 표 115.1 — 온라인 참고서와 표준 문서의 주소
- 표 115.2 — 브라우저에서 바로 돌려 보는 곳
- 표 115.3 — 눈으로 보는 도구와 이어지는 장
- 표 115.4 — 문제 사이트의 성격과 C를 배우는 사람에게 주는 것
- 표 115.5 — 무료로 읽을 수 있는 참고 자료
- 표 115.6 — 낡은 코드의 표식
- 표 115.7 — 표준판과 무료 초안
- 표 115.1 — 참고 문헌을 적는 순서
그림#
- 그림 3.1 — 기억의 칸 — 한 칸은 여덟 비트, 번호는 1씩 늘어난다
- 그림 3.2 — 빅 엔디안 — 큰 자리부터 넣는다
- 그림 3.3 — 리틀 엔디안 — 작은 자리부터 넣는다
- 그림 4.1 — 정렬이 맞은 4바이트 — 4의 배수 번호에서 시작한다
- 그림 5.1 — 한 프로그램이 쓰는 기억의 배치. 이 그림 위에서 이후의 거의 모든 장이 읽힌다.
- 그림 6.1 — 바깥은
unsigned char로 읽은 값, 안쪽은 같은 비트를signed char로 읽은 값이다. - 그림 6.2 — 같은 여덟 비트라도 원래 타입의 부호에 따라 앞칸을 채우는 값이 다르다.
- 그림 7.1 —
float과double의 비트 배치. 칸의 너비는 비트 수에 비례한다. - 그림 12.1 — 가상 쪽이 쪽 표를 거쳐 물리 쪽에 짝지어진다. 가상 주소에서 이어져 있던 쪽들이 물리 기억에서는 흩어진다 — 이 그림이 나르는 사실은 그 하나다.
- 그림 18.1 — 소스 한 줄이 기계어 몇 줄이 되는지 나란히 보여 주는 화면 얼개.
- 그림 18.2 — 값은 상자로, 포인터는 화살표로 — 시각화 도구가 그려 주는 그림.
- 그림 27.1 — 표준이 가른 타입의 갈래. 점선 상자는 여러 가지를 묶어 부르는 이름이다.
- 그림 30.1 — 정수끼리의 통상 산술 변환은 네 단계를 순서대로 따른다. 대부분의 사고는 3번에서 난다.
- 그림 36.1 — 객체
n— 200번지부터 네 칸. 55(16진수 37)가 작은 끝 순서로 들어 있다 - 그림 36.2 — 객체
p— 208번지부터 여덟 칸. 담긴 값은 200(16진수 C8), 곧n의 주소다 - 그림 36.3 — 포인터 값 하나에 붙어 다니는 세 가지. 주소만 같아도 같은 포인터가 아니다.
- 그림 39.1 — 배열
a와 무너진&a[0]은 주소는 같고 타입이 다르다 — 그래서 원소가 몇 개인지가 사라진다. - 그림 39.2 — 포인터에 더한
+1이 건너뛰는 폭은 그 포인터가 가리키는 타입의 크기다. - 그림 40.1 —
a[2][1]을 찾아가는 두 번의 점프 — 행 크기로 한 번, 원소 크기로 한 번. - 그림 41.1 — 포인터의 배열 — 배열 자체는 붙어 있고, 가리키는 곳은 흩어져 있다.
- 그림 41.2 — 부르는 쪽의 포인터를 바꾸려면 그 포인터가 사는 자리를 넘겨야 한다.
- 그림 47.1 — 빗금이 패딩이다. 멤버는 자기 정렬의 배수 자리에 놓이고, 구조체 끝에도 빈자리가 붙는다.
- 그림 47.2 — 머리와 데이터를 한 덩어리로 — 할당이 둘에서 하나로 준다.
- 그림 47.3 — 앞 멤버가 같아도 마지막 멤버의 타입이 배열의 자리를 바꾼다.
- 그림 48.1 — 구조체의 배열 — 원소 사이에 빈자리가 없어야 하므로 크기가 정렬의 배수로 올림된다.
- 그림 48.2 — 위는 구조체를 통째로 내보내 패딩까지 나가는 12바이트, 아래는 필드별로 내가 정한 순서로 적은 7바이트다.
- 그림 51.1 — 위치만 갱신하는 반복문에서 AoS 의 캐시 라인은 37.5% 만 쓰이고, SoA 의
x라인은 모두 쓰인다. - 그림 54.1 — 정규수만 있으면 0 앞에 구멍이 생긴다. 비정규수는 그 구멍을 같은 간격의 눈금으로 메운다.
- 그림 54.2 — 정규·비정규 경계 양쪽의 비트. 지수 칸은 1에서 0으로 내려가지만 실제 지수는 그대로다.
- 그림 70.1 — 상태는 객체마다, 표는 종류마다 한 벌, 행동은 코드 한 벌.
- 그림 72.1 — 표를 짓는 다섯 단계. 봉인 뒤로는 읽기만 한다.
- 그림 72.2 — 표 포인터를 객체 안에 둘 때(위)와 포인터 옆에 둘 때(아래).
- 그림 72.3 — 메시지 하나가 함수를 찾아가는 길. 대부분은 클래스의 캐시에서 끝난다.
- 그림 73.1 — 같은 종류가 이어지면 예측은 종류가 바뀌는 자리에서만 틀린다. 섞이면 거의 늘 틀린다.
- 그림 74.1 — Xt 의 클래스 레코드. 파생 레코드는 부모 레코드와 같은 모양을 맨 앞에 둔다.
- 그림 95.1 — 깃발이 보이면 그 앞의 데이터도 보이는가.
- 그림 115.1 — 하드웨어 예외가 내 C 함수까지 오는 길, 그리고 돌아갈 수 없는 이유.
- 그림 115.2 — 칩마다 다른 「하드웨어가 저장해 주는 양」 — 그 차이가 컴파일러의 일을 정한다.
- 그림 115.3 — 주소 공간이 하나인 설계와 둘인 설계.
- 그림 115.1 — 같은 한 바이트를 직렬로 보낼 때와 병렬로 보낼 때.
- 그림 115.2 — CPU 가 직접 나르는 길과 DMA 가 나르는 길.
- 그림 115.1 — 디스크 한 장에 겹쳐 있는 세 층 — 섹터의 줄, 파티션 표, 파일 시스템.
- 그림 115.2 — EBR 사슬 — 한 EBR 의 두 항목은 상대 LBA 의 기준이 다르다.
- 그림 115.3 — SSD 의 쪽과 블록 — 쓰기 증폭이 생기는 자리.
- 그림 115.1 — 형식은 달라도 로더가 묻는 질문은 같다.
- 그림 115.1 — 부팅의 사슬 — 기계는 달라도 각 칸이 하는 일은 같다.
- 그림 115.1 — 측정의 세 함정과 그 대비.
- 그림 115.2 — 실제로 잰 지연 곡선. 세로 점선이 이 기계의 캐시 경계다.
- 그림 115.3 — 걸음 폭에 따른 한 번당 비용. 세로 점선이 이 기계의 캐시 줄 크기다.
- 그림 115.4 — 예측이 맞았을 때와 틀렸을 때 파이프라인에서 벌어지는 일.
- 그림 115.5 — 두 스레드의 변수가 같은 줄에 있을 때와 떨어뜨렸을 때.