Facebook - konwersja

Efektywne zarządzanie pamięcią w C++. Praktyczne strategie i techniki tworzenia lekkiego, bezpiecznego i niezawodnego oprogramowania - ebook

Wydawnictwo:
Format:
MOBI
Data wydania:
10 marca 2026
89,00
8900 pkt
punktów Virtualo

Efektywne zarządzanie pamięcią w C++. Praktyczne strategie i techniki tworzenia lekkiego, bezpiecznego i niezawodnego oprogramowania - ebook

Zarządzanie pamięcią w C++, jeden z najbardziej wymagających aspektów tego języka programowania, stanowi jednocześnie klucz do tworzenia wydajnych i bezpiecznych aplikacji. W dobie rosnących wymagań dotyczących optymalizacji kodu, zwłaszcza w systemach czasu rzeczywistego, grach i aplikacjach wbudowanych, umiejętność efektywnego kontrolowania mechanizmów alokacji pamięci staje się szczególnie ważną kompetencją każdego programisty C++. Książka Patricea Roya, członka Komitetu Standardów ISO C++, przedstawia kompleksowe podejście do opanowania tych zaawansowanych technik.

Autor systematycznie prowadzi Czytelnika przez wszystkie aspekty zarządzania pamięcią od podstawowych koncepcji cyklu życiowego obiektów, przez implementację inteligentnych wskaźników, aż po zaawansowane techniki optymalizacji. Książka łączy teorię z praktyką, prezentując konkretne implementacje detektorów wycieków pamięci, alokatorów opartych na pulach i kontenerów generycznych. Szczegółowo omawia zarówno tradycyjne podejścia, jak i najnowsze rozwiązania wprowadzone w standardach C++20 i C++23, w tym polimorficzne zasoby pamięci (PMR) i mechanizmy placement new.

W książce:

  • implementacja własnych inteligentnych wskaźników i kontenerów
  • techniki optymalizacji oparte na pulach pamięci
  • praktyczne narzędzia diagnostyczne
  • mechanizmy alokacji dla systemów o niskim opóźnieniu i aplikacji czasu rzeczywistego
  • bezpieczne techniki manipulacji typami i obsługi wyjątków w kontekście zarządzania zasobami

Opanuj zaawansowane techniki zarządzania pamięcią w nowoczesnym C++

 

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
  • 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()
Kategoria: Programowanie
Zabezpieczenie: Watermark
Watermark
Watermarkowanie polega na znakowaniu plików wewnątrz treści, dzięki czemu możliwe jest rozpoznanie unikatowej licencji transakcyjnej Użytkownika. E-książki zabezpieczone watermarkiem można odczytywać na wszystkich urządzeniach odtwarzających wybrany format (czytniki, tablety, smartfony). Nie ma również ograniczeń liczby licencji oraz istnieje możliwość swobodnego przenoszenia plików między urządzeniami. Pliki z watermarkiem są kompatybilne z popularnymi programami do odczytywania ebooków, jak np. Calibre oraz aplikacjami na urządzenia mobilne na takie platformy jak iOS oraz Android.
ISBN: 978-83-289-3324-8
Rozmiar pliku: 3,7 MB

BESTSELLERY

Menu

Zamknij