이미 소장하고 있다면 판매해 보세요.
|
1장. C++의 간단한 소개
__C++의 사용 이유 ____비용이 들지 않는 추상화 ____이식성 ____견고성 ____C++의 현재 __이 책의 목표 ____독자에게 기대하는 지식 __다른 언어와 C++의 비교 ____언어의 성능 경쟁 ____성능과 관련 없는 C++ 언어의 기능 ____객체 소유와 C++의 가비지 컬렉션 ____C++ 참조를 사용한 널 객체 예방 ____C++의 단점 __클래스 인터페이스와 예외 처리 ____엄격한 클래스 인터페이스 ____오류 처리와 자원 관리 __이 책에서 사용한 라이브러리 __요약 2장. 최신 C++ 개념 __auto 키워드를 사용한 자동 타입 추론 ____함수 서명에서 auto 사용 ____변수에서 auto 사용 __람다 함수 ____C++ 람다 함수의 기본 구문 ____캡처 블록 ____람다와 std::function ____다형성 람다 __포인터에 대한 상수 전파 __이동 의미론 설명 ____복사 생성, 교환, 이동 ____자원의 획득과 3의 법칙 ____이동 의미론 소개 ____명명된 변수와 오른쪽 값 ____기본 이동 의미론과 영의 법칙 __std::optional로 옵션 값 표현 ____옵션 반환값 ____옵션 멤버 변수 ____정렬과 std::optional의 비교 __동적인 값을 std::any로 표현 ____std::any의 성능 __요약 3장. 성능 측정 __점근적 복잡도와 빅 O 표기법 ____증가율 ____분할 상환 시간 복잡도 __측정 대상 ____성능의 속성 ____성능 테스트: 모범 사례 __코드의 이해와 핵심 지점 ____프로파일러 __요약 4장. 데이터 구조 __컴퓨터 메모리의 속성 __STL 컨테이너 ____시퀀스 컨테이너 ____연관 컨테이너 ____정렬된 집합과 맵 ____비정렬 집합과 맵 ____컨테이너 어댑터 __평행 배열 __요약 5장. 반복자 __반복자 개념 ____반복자 분류 ____포인터와 유사한 문법 ____생성기로서의 반복자 ____반복자 특성 ____실용적인 예제: 범위 내의 부동소수점 포인트 값 반복 연산 __요약 6장. STL 알고리즘 __블록 구성을 위한 STL 알고리즘 ____STL 알고리즘의 개념 ____STL 알고리즘과 직접 만든 for 반복문의 비교 __STL과 범위 라이브러리의 미래 ____STL 반복자의 제약 사항 ____범위 라이브러리 소개 ____액션, 뷰, 알고리즘 __요약 7장. 메모리 관리 __컴퓨터 메모리 ____가상 주소 공간 ____메모리 페이지 ____스레싱 __프로세스 메모리 ____스택 메모리 ____힙 메모리 __메모리의 객체 ____객체의 생성과 해제 ____메모리 배치 ____패딩 __메모리 소유권 ____암시적 자원 관리 ____컨테이너 ____스마트 포인터 __작은 크기를 사용한 최적화 __사용자 정의 메모리 관리 ____아레나 만들기 ____사용자 정의 메모리 할당자 __요약 8장. 메타프로그래밍과 컴파일 시 평가 __템플릿 메타프로그래밍 소개 ____템플릿 파라미터로 정수 사용 ____컴파일러가 템플릿 함수를 처리하는 방법 ____컴파일 시에 오류를 트리거하는 static_assert 사용 __타입 특성 ____타입 특성 분류 ____타입 특성 사용 ____decltype을 사용한 변수 타입 가져오기 ____std::enable_if_t를 사용해 타입에 따른 조건적 함수 활성화 ____std::is_detected로 클래스 멤버 들여다보기 __constexpr 키워드 ____런타임 구문의 constexpr 함수 ____std::integral_constant를 사용한 컴파일 시 처리 과정의 검증 ____if constexpr 구문 __다원화 컨테이너 ____정적인 크기의 다원화 컨테이너 ____동적 크기의 혼합 컨테이너 __std::variant ____variant에 접근 ____variant의 다원화 컨테이너 ____variant 컨테이너의 값에 접근 ____std::get 전역 함수 __메타프로그래밍 실전 예제 ____사례 1: 리플렉션 ____전역 함수의 조건적 오버로딩 ____사례 2: 안전한 포괄적 형 변환 함수 작성 ____사례 3: 컴파일 시의 해시 문자열 __요약 9장. 프록시 객체와 지연 평가 __지연 평가와 프록시 객체의 소개 ____지연 평가와 선행 평가의 비교 __프록시 객체 ____프록시를 사용한 문자열 합치기 비교 ____프록시 구현 ____r-value 수정자 ____합쳐진 프록시 할당 __거리 비교 시 제곱 계산의 보류 ____간단한 2차원 지점 클래스 ____수학적 배경 ____DistProxy 객체 구현 ____더 유용하도록 DistProxy 확장 ____DistProxy를 사용한 거리 비교 ____DistProxy로 거리 계산 ____성능 평가 __연산자 오버로딩과 프록시 객체 생성 ____확장 메서드로서의 파이프 연산자 ____중위 연산자 ____더 읽을거리 __요약 10장. 동시성 __동시성의 기본 __동시 프로그래밍이 어려운 이유 __동시성과 병렬성 ____시분할 ____공유 메모리 ____데이터 경합 ____뮤텍스 ____교착 상태 ____동기 작업과 비동기 작업 __C++ 동시 프로그래밍 ____스레드 지원 라이브러리 ____C++의 아토믹 지원 ____C++ 메모리 모델 __잠금 없는 프로그래밍 ____잠금 없는 큐의 예 __성능 가이드 ____경합 방지 ____대기 동작 방지 ____스레드와 CPU 코어의 개수 ____스레드 우선순위 ____스레드 선호 ____거짓 공유 __요약 11장. 병렬 STL __병렬 처리의 중요성 __병렬 알고리즘 ____병렬 std::transform() 구현 ____병렬 std::count_if 구현 ____병렬 std::copy_if 구현 __병렬 STL ____실행 정책 ____병렬 버전으로 알고리즘 수정 ____인덱스 기반의 for 반복문 병렬화 __GPU에서 STL 알고리즘 실행 ____GPU API와 병렬 작업 ____STL 알고리즘과 GPU __부스트 컴퓨트 ____부스트 컴퓨트 기본 개념 ____OpenCL ____부스트 컴퓨트 초기화 ____부스트 컴퓨트에 간단한 transform-reduce 알고리즘 전달 ____부스트 컴퓨트에서 조건자 사용 ____부스터 컴퓨트에서 사용자 정의 커널 사용 __요약 |
Viktor Sehr
Bjorn Andrist
최준의 다른 상품
|
이 책의 대상 독자
독자가 C++와 컴퓨터 구조의 기초 지식과 자신의 기술을 향상시키는 데 타고난 흥미를 갖고 있다고 기대한다. 바라건대 이 책을 마치고 나면 성능, 구조 측면에서 자신의 C++ 애플리케이션을 향상시킬 수 있는 몇 가지 방법을 얻을 수 있을 것이다. “아, 그렇구나!”’라고 생각하는 순간을 갖기 바란다. 이 책의 구성 1장, ‘C++의 간단한 소개’에서는 무비용 추상화, 값 의미 체계, 상수 수정, 명시적 소유, 오류 처리 등과 같은 일부 중요한 특징을 소개한다. C++의 단점도 알아본다. 2장, ‘최신 C++ 개념’에서는 auto를 사용한 자동 타입 추정과 람다 함수, 이동 의미 체계, std::optional, std::any 등을 개괄적으로 다룬다. 3장, ‘성능 측정’에서는 점근적 복합성, 빅 O 표시법, 실용적 성능 테스트와 코드를 프로파일해 문제 지점을 찾는 방법을 설명한다. 4장, ‘데이터 구조’에서는 데이터에 빠르게 접근할 수 있도록 구성하는 작업의 중요성을 보여준다. std::vector, std::list, std::unordered_map, std::priority_queue와 같은 STL 컨테이너를 소개하고, 마지막으로 평행 배열의 반복 연산 방법을 알아본다. 5장, ‘반복자’에서는 반복 연산자의 개념을 깊이 있게 살펴보고, 반복 연산자가 단순히 컨테이너에 객체를 참조하는 것을 뛰어 넘는 방법을 보여준다. 6장, ‘STL 알고리즘’에서는 STL 알고리즘의 명백한 장점과 아주 명백하지는 않은 장점을 설명한다. 또한 STL 알고리즘의 한계와 새로운 Ranges 라이브러리로 이러한 한계를 극복하는 방법을 살펴본다. 7장, ‘메모리 관리’에서는 안전하고 효율적인 메모리 관리법을 집중적으로 다룬다. 메모리 소유권, RAII, 스마트 포인터, 스택 메모리, 동적 메모리, 사용자 메모리 할당 등을 다룬다. 8장, ‘메타프로그래밍과 컴파일 시 평가’에서는 constexpr, 다원화 컨테이너, type_traits, std::enable_if, std::is_detected와 같은 메타프로그래밍 개념을 알아본다. 또한 리플렉션과 같은 실용적인 메타프로그래밍 활용 사례도 제공한다. 9장, ‘프록시 객체와 지연 평가’에서는 프록시 객체가 깔끔한 구문을 유지하면서 아래로는 최적화를 수행하는 데 쓰이는 프록시 객체를 알아본다. 더불어 연산자 오버로딩의 창의적인 활용도 일부 알아본다. 10장, ‘동시성’에서는 병렬 실행과 공유 메모리, 데이터 경합, 교착 상태 등 동시 처리 프로그래밍의 기본을 다룬다. 또한 C++의 스레드 지원 라이브러리, 아토믹 라이브러리, C++ 메모리 모델도 소개한다. 11장, ‘병렬 STL’에서는 병렬 알고리즘 작성의 복합성을 보여준다. STL과 부스트 연산용 병렬 확장 기능을 사용하는 병렬 처리 STL 알고리즘을 활용하는 방법을 알아본다. 지은이의 말 오늘날의 C++는 여전히 대부분의 하드웨어 플랫폼을 대상으로 하거나, 실시간 처리 요구를 받는 프로그래머가 명시적이고 강력한 코드를 작성할 수 있는 능력을 주며, 이 점이 C++를 특별하게 만든다. 지난 수년간 C++는 더 즐겁게 쓸 수 있고 더 나은 기본을 갖춘 언어로 변화해왔다. 이 책은 효율적으로 애플리케이션을 작성하는 데 필요한 강력한 기본기와 최신 C++에서 라이브러리를 구현하는 전략에 관한 통찰력을 제공한다. 이 책에서는 최신 C++를 역사적으로 하나씩 살펴보기보다는 C++14/C++17의 기능 중 언어로서 타고난 부분이 어떻게 동작하는지 실용적으로 설명한다. 이 책은 빅터와 비요른의 협업으로 집필됐다. 하지만 각 장의 초안은 개별적으로 쓴 후, 내용을 향상시켜 한 권의 온전한 책으로 집성했다. 빅터는 1, 2, 5, 8, 9, 11장을, 비요른은 3, 4, 7, 10장을 책임졌다. 이 책의 전반에 걸쳐 일관성을 갖추고자 열심히 노력한 결과 이 책을 함께 쓰는 데 큰 이점이 됐다. 많은 주제를 토론했으며, 더 나은 결과를 만들었다 |
|
옮긴이의 말
현장의 여러 전문가 중 C++가 새로운 기술이고, 최근 경향에 맞는 주제라고 생각할 사람은 극히 일부일 것이다. 반면에 우리가 접하는 IT 세상에서 C++만큼 긴 시간 다뤄진 주제가 몇 개나 있을지 반문해볼 필요도 있다. C++는 그만큼 오랫동안 곁에 존재했고, 기술이 획기적으로 변화하고 발전하는 과정에서도 살아남았으며, 여전히 사랑받고 있다. 이미 C++에 익숙한 독자는 잠시 컴퓨터를 끄고, 편안한 의자에 앉아 이 책을 읽으면서 그동안 성능적인 측면에서 간과했던 부분이 없는지 살펴보길 권하고 싶다. 새로운 도전이라는 긴 여정을 앞둔 독자라면 책의 어느 한 부분에 얽매이지 말라고 얘기하고 싶다. 예를 들어 어떤 사람에게 객체나 오브젝트를 말하면 여러 속성을 가진 물건을 떠올릴 수 있다. 프로그램을 처음 배운 이는 클래스를 떠올리기도 하고, 숙련된 개발자 중에는 직접 만든 라이브러리를 머리에 떠올릴 수도 있다. 이렇게 용어는 각자 다른 형태로 관념이 된다. 처음부터 어떤 용어가 실제로 의미하는 모습 그대로 완벽하게 소화하기 어렵지만, 여러 번 실습하고 결과를 전체적으로 보는 과정을 지나 추상적인 단어도 결국 설명이 필요 없는 개념이 된다. 이 책은 번역서다. 원문을 옮기면서 저자가 전달하려는 의미를 그대로 전하는 것은 기본이다. 그러나 모국어로 다른 사람의 언어를 번역하면서 단어 선정에 하나의 기준이 더 필요했고, 의미를 가장 잘 전달하는 단어를 골라야 했다. 표준어라 할지라도 이해를 더 어렵게 만들거나 의미가 달라질 경우 가능하면 실제로 사용되는 단어나 의미를 전하기 쉬운 단어를 대신 선택했다. 하지만 쏟아져 들어오는 외국어에 대한 우리말 단어 선택은 내 능력의 부족에서 오는 안타까움을 넘어선다. 예를 들어 Supervisor는 이미 ‘슈퍼바이저, 수퍼바이저, 감독, 관리자, 감독자, 감리자, 감시자’ 등으로 여러 분야에서 번역돼 통용되고 있으며, 실제로 사용할 한 단어의 선택에 충분한 일관성과 원칙을 찾는 것은 더욱더 어려운 일이 됐다. 이렇게 실제 의미를 알면서도 적당한 우리말 하나를 선택하는 어려움은 장마다 반복됐다. 표준 용어라도 전문가가 쓰지 않는 단어보다는 가급적 실제로 사용되는 용어를 선택하는 것이 독자에게 도움이 될 것이라 생각했다. 결과적으로 최선이 아닌 표현이 있더라도 이런 현실을 감안한 독자의 양해를 구한다. |
|
C++는 1983년에 등장한 이후로 한 해도 멈추지 않고 발전을 거듭했다. C 언어를 바탕으로 단일 프론트엔드 언어에서 컴파일러 세계의 일등 시민으로 자리 잡고 있다. 매번 새로운 C++의 표준은 가끔 지나칠 정도로 많은 기능이 추가된다. 스트롭스트룹(Stroustrup)은 C++ 안에서 훨씬 더 작고 깔끔한 언어가 태어나려 한다고 말하기도 했다.
문제는 우리가 찾는 더 작고 깔끔한 언어가 상황에 따라 변하고 있다는 점이다. C++를 마스터하는 것은 이제 여러 특정 분야에 맞게 발전한 영역의 언어를 익히는 것과 마찬가지다. 임베디드(embedded) 시스템에 잘 맞는 일종의 변형 언어는 대규모의 기업용 애플리케이션에서는 통하지 않고, 강력한 게임 엔진용 표현은 문서 처리기에서는 통하지 않는다. 이 책은 고성능용 코드를 신속하게 개발하는 하나의 C++ 변형을 설명한다. C++11로 시작해서 방대한 기능을 가진 C++ 언어와 애플리케이션의 작성에 더 많은 시간을 소비하지만, 세부 기능의 실행에는 시간을 덜 소비하는 C++ STL을 아우른다. 이것이 이 책이 C++를 바라보는 관점이다. 이 책의 개별 주제는 애플리케이션 개발과 컴퓨터 공학을 큰 틀에서 다룬다. 최신 C++ 기술의 정보를 따라잡고자 하는 독자에게 필요한 핵심적인 변화를 다뤄서 중심을 잡아준다. 여기서 나오는 특정 예제와 논리적 전개 등은 알고리즘의 기본적인 사용법에서 출발해 GPU에서 OpenCL로 자신의 알고리즘을 실행할 수 있도록 실력을 향상시켜준다. 현재 C++의 근본적인 문제(메모리 관리와 소유, 시간과 공간에 대한 고민, 고급 템플릿 사용법 등)를 단계적으로 풀어가면 이 책의 후반부에서는 자신감을 갖고 고급 기술의 영역에 도달하게 될 것이다. 나는 크거나 작은 로우레벨, 관리되는 프로젝트, 심지어 맞춤 설계된 언어를 사용하는 프로젝트 등 다양한 프로젝트를 수행했지만, C++는 항상 내 마음속에 특별하게 간직하고 있다. 2000년대에 내가 첫 정규직으로 근무한 게임 기술 회사에서의 주 업무는 C++ 코드를 작성하는 것이었다. 업무의 주요 기술이 편집기와 스크립팅 언어에 C++ 코드 베이스를 반영하는 것이었으므로 그 일을 사랑했다. 어떤 사람은 C++가 강아지에 다리를 덧붙여 문어로 만든 것 같다고 얘기한다. 나는 C++가 의도하지 않은 방향으로 가지 않도록 코드 베이스를 망치로 두들겨 가면서 많은 노력을 기울였다. 아직까지는 그 문어가 나름의 방식대로 아름답고 효과적이다. C++는 과거에서 현재까지 엄청난 발전을 해왔다. 이제 가능성으로 가득한 흥미진진한 세상으로 가는 문을 독자에게 열어주는 게 된 것은 나의 영광이다. 빅터(Viktor)와 비요른(Bjorn)은 경험이 많고 뛰어난 업적을 남긴 멋진 개발자이며, 독자를 위해 매우 많고 훌륭한 것을 저장해두고 있다. - 벤 가니(Ben Garney) (엔진 컴퍼니(The Engine Company)의 CEO) |