Efektywne zarz - Helion

ebook
Autor: Patrice RoyTytuł oryginału: C++ Memory Management: Write leaner and safer C++ code using proven memory-management techniques
Tłumaczenie: Robert G
ISBN: 978-83-289-3324-8
stron: 392, Format: ebook
Data wydania: 2026-04-01
Księgarnia: Helion
Cena książki: 44,50 zł (poprzednio: 89,00 zł)
Oszczędzasz: 50% (-44,50 zł)
Tagi: C++ - Programowanie
Spis treści
Efektywne zarządzanie pamięcią w C++. Praktyczne strategie i techniki tworzenia lekkiego, bezpiecznego i niezawodnego oprogramowania eBook -- spis treści
O autorze
O korektorach merytorycznych
Wprowadzenie
Przedmowa
Wprowadzenie
Część 1. Pamięć w C++
- Rozdział 1. Obiekty, wskaźniki i referencje
- Wymagania techniczne
- Reprezentacja pamięci w C++
- Obiekty, wskaźniki i referencje
- Zrozumienie podstawowych właściwości obiektów
- Cykl życiowy obiektu
- Wielkość obiektu, jego wyrównanie i wypełnienie
- Kopiowanie i przenoszenie
- Tablice
- Podsumowanie
- Rozdział 2. Na co należy uważać?
- Różne rodzaje zła
- Źle sformułowany kod, bez wymaganej diagnostyki
- Niezdefiniowane zachowanie
- Zachowanie definiowane przez implementację
- Nieokreślone zachowanie (niezdefiniowane w dokumentacji)
- Zasada jednej definicji
- Błędne zachowanie
- Wskaźniki
- Zastosowania arytmetyki wskaźników w tablicach
- Wymienialność wskaźników
- Wykorzystanie arytmetyki wskaźników wewnątrz obiektu
- Manipulowanie typami
- Manipulacja typami poprzez elementy składowe unii
- Typy intptr_t i uintptr_t
- Funkcja std::memcpy()
- Szczególne przypadki char*, unsigned char* i std::byte*
- Funkcja std::start_lifetime_as<T>()
- Podsumowanie
- Różne rodzaje zła
- Rozdział 3. Rzutowanie i kwalifikatory cv
- Wymagania techniczne
- Czym jest rzutowanie?
- Bezpieczeństwo w systemie typów - kwalifikatory cv
- Rzutowania w C++
- Twój najlepszy przyjaciel (w większości przypadków) - static_cast
- Sygnał, że coś jest nie tak - dynamic_cast
- Igranie z bezpieczeństwem - const_cast
- "Uwierz mi, kompilatorze" - reinterpret_cast
- Wiem, że bity są poprawne - bit_cast
- Nieco niezwiązane, ale warte wspomnienia - duration_cast
- Znienawidzone rzutowanie w stylu C
- Podsumowanie
Część 2. Techniki niejawnego zarządzania pamięcią
- Rozdział 4. Korzystanie z destruktorów
- Wymagania techniczne
- Destruktory - krótkie podsumowanie
- Zarządzanie zasobami
- Obsługa wyjątków. czy może nie?
- Idiom RAII
- RAII i specjalne funkcje składowe C++
- Potencjalne pułapki
- Destruktory nie powinny zgłaszać wyjątków
- Poznaj kolejność niszczenia obiektów
- Standardowe narzędzia do automatyzacji zarządzania zasobami
- unique_ptr<T> i shared_ptr<T>
- lock_guard i scoped_lock
- Obiekty strumieniowe
- vector<T> i inne kontenery
- Podsumowanie
- Rozdział 5. Korzystanie ze standardowych inteligentnych wskaźników
- Wymagania techniczne
- Standardowe inteligentne wskaźniki
- O wyrażaniu intencji poprzez sygnatury funkcji
- Typ unique_ptr
- Obsługa obiektów
- Obsługa tablic
- Niestandardowe funkcje usuwające
- make_unique
- Typy shared_ptr i weak_ptr
- Użyteczność i koszty
- make_shared()
- A co z weak_ptr?
- Kiedy stosować nieprzetworzone wskaźniki?
- Podsumowanie
- Rozdział 6. Implementowanie inteligentnych wskaźników
- Wymagania techniczne
- Semantyka własności
- Implementacja własnej wersji unique_ptr
- Sygnatura typu
- Specjalne funkcje składowe
- Funkcje przypominające wskaźniki
- Implementacja własnej, prostej wersji inteligentnego wskaźnika shared_ptr
- Kilka słów o funkcji make_shared()
- Implementacja wskaźnika powielającego opartego na polityce
- Wykrywanie za pomocą interfejsów
- Wykrywanie za pomocą cech
- Wykrywanie za pomocą konceptów
- Kilka prostych, ale wciąż przydatnych inteligentnych wskaźników
- Wskaźnik non_null_ptr
- Typ observer_ptr
- Podsumowanie
Część 3. Przejmowanie kontroli (nad mechanizmami zarządzania pamięcią)
- Rozdział 7. Przeciążanie operatorów alokacji pamięci
- Dlaczego warto przeciążać funkcje alokacji pamięci?
- Krótki przegląd funkcji alokacji pamięci w języku C
- Przegląd funkcji alokacji pamięci w C++
- Globalne funkcje alokacji
- Funkcje alokacji, które nie zgłaszają wyjątków
- Najważniejsza funkcjonalność operator new - mechanizm placement new
- Funkcje alokacji dla elementów składowych
- Funkcje alokacji, które uwzględniają wyrównanie
- Niszcząca funkcja delete
- Podsumowanie
- Rozdział 8. Implementacja prostego detektora wycieków pamięci
- Wymagania techniczne
- Plan
- Pierwsze podejście (które prawie działa)
- Klasa singleton Accountant
- Implementacja funkcji operator new i new[]
- Implementacja funkcji operator delete i delete[]
- Wizualizacja całości
- Wyszukiwanie (i rozwiązywanie) problemów
- Powrót do naszej implementacji (i wyciągnięcie wniosków)
- Podsumowanie
- Rozdział 9. Nietypowe mechanizmy alokacji
- Wymagania techniczne
- Mechanizm placement new i sprzęt mapowany w pamięci
- Uproszczenie użycia wersji nothrow funkcji operator new
- Brak pamięci i funkcja new_handler
- Standardowy C++ a nietypowe zarządzanie pamięcią
- Fikcyjne API pamięci współdzielonej
- Przykład kodu użytkownika
- Standardowo wyglądający odpowiednik kodu użytkownika
- Podsumowanie
- Rozdział 10. Zarządzanie pamięcią oparte na pulach i inne optymalizacje
- Wymagania techniczne
- Zarządzanie pamięcią oparte na pulach
- Konkretny przykład - implementacja oparta na wielkości
- Uogólnienie do SizeBasedArena<T,N>
- Gdy parametry ulegają zmianie
- Pule fragmentowane
- Podsumowanie
- Rodział 11. Odroczone zwalnianie pamięci
- Wymagania techniczne
- Co oznacza odroczone zwalnianie pamięci?
- Odzyskiwanie zasobów (bez finalizacji) pod koniec programu
- Odzyskiwanie zasobów i finalizacja na końcu programu
- Odzyskiwanie zasobów i finalizacja na końcu zasięgu
- Podsumowanie
Część 4. Tworzenie kontenerów generycznych (i trochę więcej)
- Rozdział 12. Tworzenie kontenerów generycznych z jawnym zarządzaniem pamięcią
- Wymagania techniczne
- Implementacja własnej alternatywy dla vector<T>
- Wybór reprezentacji dla kontenera z ciągłymi elementami
- Implementacja Vector<T>
- Implementacja własnej alternatywy dla forward_list<T>
- Wybór reprezentacji dla kontenera opartego na węzłach
- Implementacja ForwardList<T>
- Efektywniejsze zarządzanie pamięcią
- Znacznie wydajniejszy typ Vector<T>
- Korzystanie z niskopoziomowych narzędzi standardowych
- Stałe składowe lub referencyjne a std::launder()
- Podsumowanie
- Rozdział 13. Tworzenie kontenerów generycznych z niejawnym zarządzaniem pamięcią
- Wymagania techniczne
- Dlaczego jawne zarządzanie pamięcią komplikuje naszą implementację?
- Niejawne zarządzanie pamięcią za pomocą inteligentnego wskaźnika
- Wpływ na prostą implementację Vector<T>
- Wpływ na zaawansowaną implementację Vector<T>
- Skutki przeprojektowania klasy
- Uogólnienie do ForwardList<T>?
- Próba zdefiniowania każdego węzła jako odpowiedzialnego za swojego następcę
- Próba zdefiniowania wskaźnika head jako odpowiedzialnego za pozostałe węzły
- Podsumowanie
- Rozdział 14. Tworzenie kontenerów generycznych z obsługą alokatorów
- Wymagania techniczne
- Dlaczego alokatory?
- Klasyczne alokatory
- Przed C++11
- Tradycyjne alokatory we współczesnych standardach
- Zarządzanie tradycyjnym cyklem życiowym alokatora
- Problemy z tradycyjnymi alokatorami
- Polimorficzne alokatory zasobów pamięci
- Zagnieżdżone alokatory
- Alokatory i zbieranie danych
- Zalety i koszty
- Podsumowanie
- Rozdział 15. Współczesne zagadnienia
- Wymagania techniczne
- Rozpoczynanie cyklu życiowego obiektu bez konstruktorów
- Prosta relokacja
- Funkcje alokacji i zwalniania pamięci, które znają typy
- Podsumowanie
Dodatek. Co powinieneś wiedzieć?
- struktury i klasy
- std::size_t
- Operator sizeof
- Asercje
- Niezdefiniowane zachowanie
- Cechy typów
- Cechy std::true_type i std::false_type
- Cecha std::conditional<B,T,F>
- Algorytmy
- Funktory (obiekty funkcyjne) i wyrażenia lambda
- Przyjaciele
- Operator decltype
- Idealne przekazywanie
- Wzorzec projektowy singleton
- Tworzenie egzemplarza podczas uruchamiania programu
- Inicjalizacja w trakcie pierwszego wywołania
- Funkcja std::exchange()
