Wysoce wydajny C++. Opanuj sztuk - Helion
ISBN: 978-83-283-9708-8
okładka: mi
Księgarnia: Helion
Książka będzie dostępna od października 2022
Zobacz także:
- Windows Media Center. Domowe centrum rozrywki 66,67 zł, (8,00 zł -88%)
- Ruby on Rails. Ćwiczenia 18,75 zł, (3,00 zł -84%)
- Przywództwo w świecie VUCA. Jak być skutecznym liderem w niepewnym środowisku 58,64 zł, (12,90 zł -78%)
- Scrum. O zwinnym zarządzaniu projektami. Wydanie II rozszerzone 58,64 zł, (12,90 zł -78%)
- Od hierarchii do turkusu, czyli jak zarządzać w XXI wieku 58,64 zł, (12,90 zł -78%)
Spis treści
Wysoce wydajny C++. Opanuj sztukę optymalizowania działania kodu. Wydanie II -- spis treści
Przedmowa
O autorach
O korektorach merytorycznych
Wprowadzenie
- Dla kogo przeznaczona jest ta książka?
- Zawartość książki
- Jak najlepiej skorzystać z tej książki?
- Pobieranie plików z przykÅ‚adowym kodem
- Stosowane konwencje typograficzne
RozdziaÅ‚ 1. Krótkie wprowadzenie do jÄ™zyka C++
- Dlaczego C++?
- Bezkosztowe abstrakcje
- Przenośność
- Odporność
- Język C++ dzisiaj
- Porównanie C++ z innymi jÄ™zykami
- Konkurencyjne języki i wydajność
- Mechanizmy języka C++ niezwiązane z wydajnością
- Wady języka C++
- Biblioteki i kompilatory używane w tej książce
- Podsumowanie
Rozdział 2. Podstawowe techniki języka C++
- Automatyczne wykrywanie typów za pomocÄ… sÅ‚owa kluczowego auto
- Stosowanie słowa kluczowego auto w sygnaturach funkcji
- Stosowanie słowa kluczowego auto dla zmiennych
- Semantyka przenoszenia
- Tworzenie przez kopiowanie, wymienianie i przenoszenie
- Pozyskiwanie zasobów i reguÅ‚a piÄ™ciu
- Zmienne nazwane i r-wartości
- Domyślna semantyka przenoszenia i reguła zera
- Stosowanie modyfikatora && do funkcji składowych klas
- Nie przenoÅ› obiektów, jeÅ›li kopiowanie i tak jest pomijane
- Jeśli to możliwe, stosuj przekazywanie przez wartość
- Projektowanie interfejsów z obsÅ‚ugÄ… bÅ‚Ä™dów
- Kontrakty
- ObsÅ‚uga bÅ‚Ä™dów
- Obiekty funkcyjne i wyrażenia lambda
- Podstawowa składnia lambd w języku C++
- Klauzula przechwytywania
- Przypisywanie do lambd wskaźników do funkcji jÄ™zyka C
- Typy lambd
- Lambdy i typ std::function
- Generyczne lambdy
- Podsumowanie
Rozdział 3. Analizowanie i pomiar wydajności
- Złożoność asymptotyczna i notacja dużego O
- Tempo wzrostu
- Zamortyzowana złożoność czasowa
- Co mierzyć i w jaki sposób?
- Aspekty wydajności
- Przyspieszanie wykonywania kodu
- Liczniki wydajności
- Testy wydajności - dobre praktyki
- Poznaj kod i znajdź hot spoty
- Profilery z instrumentacjÄ…
- Profilery z próbkowaniem
- Mikrotesty
- Prawo Amdahla
- Pułapki związane z mikrotestami
- Przykład ilustrujący mikrotesty
- Podsumowanie
Rozdział 4. Struktury danych
- Cechy pamięci w komputerach
- Kontenery z biblioteki standardowej
- Kontenery sekwencyjne
- Kontenery asocjacyjne
- Adaptery kontenerów
- Używanie widoków
- Unikanie kopiowania dzięki typowi string_view
- Unikanie utraty informacji o długości tablic dzięki typowi std::span
- Uwagi na temat wydajności
- Zapewnianie równowagi miÄ™dzy gwarancjami zÅ‚ożonoÅ›ci a dodatkowymi kosztami
- Znajomość i stosowanie odpowiednich funkcji API
- Tablice równolegÅ‚e
- Podsumowanie
Rozdział 5. Algorytmy
- Wprowadzenie do algorytmów z biblioteki standardowej
- Ewolucja algorytmów z biblioteki standardowej
- RozwiÄ…zywanie codziennych problemów
- Iteratory i zakresy
- Wprowadzenie do iteratorów
- Wartość wartownika i iteratory zakońcowe
- Zakresy
- Kategorie iteratorów
- Cechy algorytmów standardowych
- Algorytmy nie zmieniają wielkości kontenera
- Algorytmy zwracające dane wyjściowe wymagają zaalokowanych danych
- Algorytmy domyślnie używają funkcji operator==() i operator<()
- W algorytmach z ograniczeniami używane są projekcje
- Algorytmy wymagajÄ…, aby operatory przenoszÄ…ce nie zgÅ‚aszaÅ‚y wyjÄ…tków
- Algorytmy mają gwarantowaną złożoność
- Algorytmy dziaÅ‚ajÄ… równie dobrze jak analogiczne funkcje z bibliotek jÄ™zyka C
- Pisanie i stosowanie algorytmów generycznych
- Algorytmy niegeneryczne
- Algorytmy generyczne
- Struktury danych, które mogÄ… być używane przez algorytmy generyczne
- Dobre praktyki
- Stosowanie algorytmów z ograniczeniami
- Sortowanie tylko tych danych, które bÄ™dÄ… pobierane
- Stosowanie algorytmów standardowych zamiast surowych pÄ™tli for
- Unikanie tworzenia kopii kontenera
- Podsumowanie
Rozdział 6. Zakresy i widoki
- Powody powstania biblioteki Ranges
- Ograniczenia biblioteki Algorithm
- Widoki z biblioteki Ranges
- Widoki można łączyć w łańcuch
- Widoki zakresów i adaptery zakresów
- Widoki sÄ… zakresami bez wÅ‚asnoÅ›ci elementów oferujÄ…cymi gwarancje zÅ‚ożonoÅ›ci
- Widoki nie modyfikujÄ… podstawowego kontenera
- Widoki można materializować do postaci kontenerów
- Widoki sÄ… przetwarzane leniwie
- Widoki z biblioteki standardowej
- Widoki dla zakresów
- Jeszcze o typach std::string_view i std::span
- Przyszłość biblioteki Ranges
- Podsumowanie
Rozdział 7. Zarządzanie pamięcią
- Pamięć w komputerze
- Wirtualna przestrzeń adresowa
- Strony pamięci
- Migotanie
- Pamięć procesu
- Pamięć na stosie
- Pamięć na stercie
- Obiekty w pamięci
- Tworzenie i usuwanie obiektów
- Wyrównanie pamiÄ™ci
- Dopełnienie
- Własność pamięci
- Pośrednie zarządzanie zasobami
- Kontenery
- Inteligentne wskaźniki
- Optymalizacja maÅ‚ych obiektów
- Niestandardowe zarządzanie pamięcią
- Tworzenie puli pamięci
- Niestandardowy alokator pamięci
- Stosowanie polimorficznych alokatorów pamiÄ™ci
- Implementowanie niestandardowego zasobu pamięciowego
- Podsumowanie
Rozdział 8. Programowanie z przetwarzaniem w czasie kompilacji
- Wprowadzenie do metaprogramowania z użyciem szablonów
- Tworzenie szablonów
- Stosowanie liczb caÅ‚kowitych jako parametrów szablonu
- Tworzenie specjalizacji szablonu
- Jak kompilator przetwarza funkcjÄ™ szablonowÄ…?
- Skrócone szablony funkcji
- Pobieranie typu zmiennej za pomocÄ… specyfikatora decltype
- Cechy typów
- Kategorie cech typów
- Stosowanie cech typów
- Programowanie z użyciem stałych wyrażeń
- Działanie funkcji ze słowem kluczowym constexpr w czasie wykonywania programu
- Deklarowanie funkcji natychmiastowych za pomocą słowa kluczowego consteval
- Instrukcja if constexpr
- Sprawdzanie bÅ‚Ä™dów programistycznych w czasie kompilacji
- Ograniczenia i koncepty
- Szablon Point2D bez ograniczeń
- Omówienie skÅ‚adni ograniczeÅ„ i konceptów
- Wersja szablonu Point2D z ograniczeniami
- Dodawanie ograniczeń do kodu
- Koncepty w bibliotece standardowej
- Praktyczne przykłady metaprogramowania
- Przykład nr 1: tworzenie generycznej bezpiecznej funkcji rzutowania
- PrzykÅ‚ad nr 2: obliczanie skrótów Å‚aÅ„cuchów znaków w czasie kompilacji
- Podsumowanie
Rozdział 9. Podstawowe narzędzia
- Reprezentowanie wartości opcjonalnych za pomocą typu std::optional
- Opcjonalne zwracane wartości
- Opcjonalne zmienne składowe
- Unikanie pustych stanów w wyliczeniach
- Sortowanie i porównywanie wartoÅ›ci typu std::optional
- Kolekcje niejednorodne o stałej wielkości
- Stosowanie typu std::pair
- Typ std::tuple
- Kolekcje niejednorodne o dynamicznie zmienianej wielkości
- Typ std::variant
- Kolekcje niejednorodne z obiektami typu std::variant
- DostÄ™p do wartoÅ›ci z kontenera elementów typu VariantType
- Praktyczne przykłady
- PrzykÅ‚ad nr 1: projekcje i operatory porównania
- Przykład nr 2: refleksja
- Podsumowanie
Rozdział 10. Obiekty pośredniczące i leniwe przetwarzanie
- Wprowadzenie do leniwego przetwarzania i obiektów poÅ›redniczÄ…cych
- Przetwarzanie leniwe i przetwarzanie zachłanne
- Obiekty pośredniczące
- Stosowanie obiektów poÅ›redniczÄ…cych do zapobiegania tworzeniu obiektów
- Porównywanie scalanych Å‚aÅ„cuchów znaków z wykorzystaniem obiektu poÅ›redniczÄ…cego
- Implementowanie obiektu pośredniczącego
- Modyfikator r-wartości
- Przypisywanie połączonej wartości do obiektu pośredniczącego
- Ocena wydajności
- Odraczanie obliczania kwadratów
- Prosta klasa reprezentujÄ…ca wektory dwuwymiarowe
- Obliczenia matematyczne
- Implementowanie klasy LengthProxy
- Porównywanie dÅ‚ugoÅ›ci za pomocÄ… klasy LengthProxy
- Obliczanie długości za pomocą klasy LengthProxy
- Ocena wydajności
- PomysÅ‚owe przeciążanie operatorów i obiekty poÅ›redniczÄ…ce
- Operator potoku jako metoda rozszerzajÄ…ca
- Podsumowanie
RozdziaÅ‚ 11. WspóÅ‚bieżność
- Podstawy wspóÅ‚bieżnoÅ›ci
- Co sprawia, że programowanie wspóÅ‚bieżne jest trudne?
- WspóÅ‚bieżność a równolegÅ‚ość
- Porcjowanie czasu
- WspóÅ‚dzielona pamięć
- Sytuacja wyścigu
- Muteks
- Zakleszczenie
- Zadania synchroniczne i zadania asynchroniczne
- Programowanie wspóÅ‚bieżne w jÄ™zyku C++
- Biblioteka obsÅ‚ugi wÄ…tków
- Dodatkowe podstawowe mechanizmy synchronizacji w standardzie C++20
- Obsługa zmiennych atomowych w języku C++
- Model dostępu do pamięci w języku C++
- Programowanie bez blokad
- Przykład: kolejka bez blokad
- Wskazówki dotyczÄ…ce wydajnoÅ›ci
- Zapobieganie rywalizacji
- Unikanie operacji blokujÄ…cych
- Liczba wÄ…tków i rdzeni procesora
- Priorytety wÄ…tków
- Koligacja wÄ…tków
- Niezamierzone wspóÅ‚dzielenie
- Podsumowanie
Rozdział 12. Korutyny i leniwe generatory
- Kilka przykÅ‚adów uzasadniajÄ…cych stosowanie korutyn
- Abstrakcja reprezentujÄ…ca korutyny
- Podprocedury i korutyny
- Wykonywanie podprocedur i korutyn w procesorze
- Korutyny bezstosowe i korutyny stosowe
- Czego Czytelnik nauczył się do tego miejsca?
- Korutyny w języku C++
- Co zostało uwzględnione w standardzie języka C++ (i co zostało pominięte)?
- Co sprawia, że funkcja w języku C++ jest korutyną?
- Minimalny, lecz kompletny przykład
- Alokowanie stanu korutyny
- Zapobieganie wiszÄ…cym referencjom
- ObsÅ‚uga bÅ‚Ä™dów
- Punkty konfiguracyjne
- Generatory
- Implementowanie generatora
- Stosowanie klasy Generator
- Praktyczny przykÅ‚ad zastosowania generatorów
- Wydajność
- Podsumowanie
Rozdział 13. Programowanie asynchroniczne z użyciem korutyn
- Jeszcze o typach awaitable
- Automatyczne punkty wstrzymywania
- Implementowanie prostego typu reprezentujÄ…cego zadanie
- ObsÅ‚uga zwracanych wartoÅ›ci i wyjÄ…tków
- Wznawianie oczekujÄ…cej korutyny
- Dodawanie obsługi zadań zwracających void
- Synchroniczne oczekiwanie na ukończenie zadania
- Testowanie asynchronicznych zadań z użyciem funkcji sync_wait()
- Tworzenie nakładki na API opartym na wywołaniach zwrotnych
- WspóÅ‚bieżny serwer zbudowany za pomocÄ… biblioteki Boost.Asio
- Implementowanie serwera
- Uruchamianie serwera i nawiązywanie z nim połączenia
- Co osiągnęliśmy za pomocą serwera (i czego wciąż brakuje)?
- Podsumowanie
RozdziaÅ‚ 14. Algorytmy równolegÅ‚e
- Znaczenie równolegÅ‚oÅ›ci
- Algorytmy równolegÅ‚e
- Ocena algorytmów równolegÅ‚ych
- Jeszcze o prawie Amdahla
- Implementowanie równolegÅ‚ego algorytmu std::transform()
- Implementowanie równolegÅ‚ej wersji algorytmu std::count_if()
- Implementowanie równolegÅ‚ej wersji algorytmu std::copy_if()
- Algorytmy równolegÅ‚e z biblioteki standardowej
- Strategie wykonywania
- ObsÅ‚uga wyjÄ…tków
- Dodatki i zmiany w algorytmach równolegÅ‚ych
- Zrównoleglanie pÄ™tli for opartej na indeksie
- Wykonywanie algorytmów w procesorze graficznym
- Podsumowanie