Beautiful C++: Updating Legacy Code pluralsight Link
Bjarne Stroustrup: C++11 Style - konferencja
******************
Beautiful C++: Updating Legacy Code
(podobne do C vs C++ z rozdziału LINK )-strcpy - z punktu widzenia c++ niebezpieczne (w VC++ uzyj strcpy_s)
-Słowa kluczowe w C++ Link
-deffine nie mają typu i zakresu - uzywaj Const static member
-zamiast Enum użyj enum class (bezpieczne typowanie)
-zamiast makrofunkcji - lambda [&]() { tresc } albo Template jeśli potrzebujesz różnych typów
-c++ cechy:
definiowane własne typy
RAII * (deterministic destruction )
Polimorphism (virtualne funkcje i chierarchia dziedziczenia, posługiwanie się ogólnym typem)
Templates
Const-correctness -using the keyword const to prevent const objects from getting mutated LINK
*RAII - Przejęcie zasobu jest połączone z konstrukcją, a zwolnienie z automatyczną destrukcją zmiennej. Ponieważ wywołanie destruktora jest automatyczne, gdy zmienna wyjdzie poza swój zasięg, jest zagwarantowane, że zasób zostanie zwolniony od razu gdy skończy się czas życia zmiennej. Stanie się tak również przy wystąpieniu wyjątku. RAII jest kluczową koncepcją przy pisaniu kodu odpornego na błędy. Technika RAII jest używana na przykład przy zakładaniu blokad wątków albo obsłudze plików. Własność pamięci przydzielanej dynamicznie (za pomocą new w C++) może być również kontrolowana za pomocą RAII. Do tego celu biblioteka standardowa C++11 definiuje inteligentne wskaźniki: std::unique_ptr dla obiektów z jednym właścicielem, oraz std::shared_ptr dla obiektów współdzielonych
-czyli twórz w konstruktorze, zwalniaj w destruktorze (destruktor wywoływany automatycznie po przekorczeniu zakresu )
-rozważ sposób tworzenia kopii (płytkie - głębokie) rozważ niekopiowalność (2 konstruktory = delete) Resource(Resource const& other) = delete; Resource& operator=(Resource const& other) = delete;
-c++ tworzenie klasy z kodu strukturalnego (funkcje)
wrzuć zmienne do przestrzeni publicznej, powiązame zmienne stwórz jako nowych memberów (zainicjalizuj w konstruktorze - liście inicjalizacyjnej)
dodaj publiczne metody na podstawie istniejacych funkcji
zamien zmienne na prywatne - smprawdz czy działa (enkapsulacja)
jeśli trzeba dodaj settery i gettery do nich (ale tylko jeśli potrzeba)
zmienn nazwy zmiennych na klasowe ( m_ )
-jeśli powtarzarz istnienie wielu podobnych funkcji, rozważ dziedziczenie
-uzywaj const gdzie tylko mozesz, dodawaj to na samym początku tworzenia (nie tylko zmienne, ale i funkcje - które nie zmianiają niczego )
-nie używaj Typedef dla structur (styl C)
-uzywaj poprawnego castowania (c++ style static_cast<> dynamic_cast<> reinterpret_cas<> const_cast<>
-zamien NULL na nullptr
-uzywaj range for
-kiedy konstruktor private? dla niekopiowalnych, nie tworzy obiektu (klasa ze statycznymi elementami) , nie dziedzicznych, Singleton
ale generalnie uzywaj =delete zamiast wrzucać w obszar prywatny
-wymuszenie uzycia konstruktora =default przeciwnienstwo =delete
STL:
-std::string: (zamiast tablicy char w stylu C)
sam zarządza pamięcią
ma wbudowane funkcje
przeladowane operatory
kontener wiec działa z algorytmami
konwersje
move semantics
std::vector
te same zalety co wyżej
zajmuje ciągły obszar pamięci
Rozważ std::array for fixed-size collections
Zamiana starych tablic C na kontenery c++, kroki:
-zacznij tam gdzie tablica char* or [] jest tworzona
-zmien typ zmiennej
-zamien size variable na .size()
-oczyść kod z delete (kontenery same zwalniają pamięć)
-zastąp pętle wykonujące kod na tablicach, algorytmami
-iteruj Range forem
-zmien funkcje w których przekazywałeś tablice jako argument (rozważ kopie, referencję, const)
-uzyj .c_str() jeśli potrzebujesz stringa z char*
SmartPointers <memory>
-RAII is great (alocate in constructor - release in destructor, rozważ zachowanie kopi płytka-głęboka)
zastanów się nad lifetime and ownership i wybierz std::unique_ptr std:share_ptr
sharepointer nie powinien byc pierwszym wyborem, raczej unique (wymusza argumenty przez &)
Bjarne Stroustrup: C++11 Style - konferencja
27:22 - keep interfaces strongly typed (avoid general types in interfaces)
Resources and Errors
30:49 RAII - przyklad z otwarciem pliku, uzycie klasy handle
Resource acquisition is initialization - Przejęcie zasobu jest połączone z konstrukcją, a zwolnienie z automatyczną destrukcją zmiennej
33:34 Resource Handles and Pointers (no naked New!) czysty pointer nie jest
bezpieczny z rzucaniem wyjatkow, wychodzi z funkcji i nie robi delete.
uzyj smart ale nie shared_ptr, tylko unique_ptr, wyjdzie z zakresu-skasuje
po co wogóle pointery a nie lokalne?
jeśli nie uzywasz danych "na zewnątrz" zrezygnuj całkowicie z pointerów
35:50 Resource Management Style:
-Prefer classes where the resource management is part of their semantics (vextor, thread)
-use "smart pointers" unique for unique ownership, shared for shared
-pamietaj nie uzywaja pointerow jesli nie musisz, pointer to ryzyko race condition!!
37:54 Move resources - bad example - zastąpione semantyka przenosenia
(tylko std:array nie moze byc moved, reszta kontenerow moze )
43:21 Style:
-no naked pointers
-keep arrays out of interfaces (prefer containers)
-always consider std::unique_ptr and sometimes std::shared_ptr
-return objects "by value" (its using move not copy - copy elision)
(no fiddle with pointer,references )
Use compact data:
vector vs List (jeden szybko wstawia, drugi szybko przechodzi do elementu )
ale czemy uzywac kompaktowych (vector)
lista przechowuje dodatkowo wskazniki na poprzedzajacy i nastepny co przy
64 bitowej atchitekturze powoduje ze 100000 elementow w liscie zajmie 6,4MB a vectorze 1,6MB
Pamiętaj dostęp do pamięci jest bardzo wolny, 200 instrukcji na jeden dostęp
im bardziej kompaktowy kontener (mniejszy) tym większa szansa umieszczenia w cache!!!
Prefer algorithm to unstructured code (czesto szybszy, zawsze bezpieczniejszy)
Stay high level:
-for_each alghorithm create the same code than for loop
-c++ sort() is fastes than C qsort.
Dziedziczenie:
-uzywaj tylko kiedy masz hierarchiczną strukturę
-nie naduzywaj tego
Watki:
1:05:25 - przyklad watków z async i auto
reguła 0:
korzystaj z deflautowych konstruktorów, jesli napiszesz destruktor dopisz reszte z deflaut.