Konec a tak. PB173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 15.

Podobné dokumenty
Hrátky s funkcemi. PV173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 29.

Šablony, kontejnery a iterátory

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

PB161 Programování v jazyce C++ Přednáška 10

Šablony, kontejnery a iterátory

PB161 Programování v jazyce C++ Přednáška 10

Programování v C++ 2, 4. cvičení

PB161 Programování v jazyce C++ Přednáška 8

Jazyk C++ II. STL knihovna kontejnery část 1

PB161 Programování v jazyce C++ Přednáška 4

Cvičení z programování v C++ ZS 2016/2017 Přemysl Čech

Programování v C++ 1, 5. cvičení

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Domácí úkoly 2013/14

Šablony funkcí a tříd (Templates) Genericita

Standardní algoritmy v C++.

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Abstraktní datové typy

PREPROCESOR POKRAČOVÁNÍ

PB161 Programování v jazyce C++ Přednáška 3

Dědění, polymorfismus

Hornerovo schéma. je algoritmus výpočtu hodnoty polynomu P(x) v bodě x 0. eliminuje výpočet i-té mocniny převodem na postupné násobení.

PB přednáška (23. listopadu 2015)

Základní datové struktury

Více o konstruktorech a destruktorech

PB161 Programování v jazyce C++ Přednáška 3

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

1 Nejkratší cesta grafem

Jazyk C# (seminář 6)

Množina v C++ (set, multiset).

8 Třídy, objekty, metody, předávání argumentů metod

PB161 Programování v jazyce C++ Přednáška 9

PB161 Programování v jazyce C++ Přednáška 1

PB161 Programování v jazyce C++ Přednáška 1

PB161 Programování v jazyce C++ Přednáška 9

PB161 Programování v jazyce C++ Přednáška 4

Jazyk C++, některá rozšíření oproti C

PB přednáška (26. října 2015)

IUJCE 07/08 Přednáška č. 1

Základy programování (IZP)

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

PB161 Programování v jazyce C++ Přednáška 11

Zápis programu v jazyce C#

Struktury, funkce, reference

Úvod do programování - Java. Cvičení č.4

PB161 Programování v jazyce C++ Přednáška 7

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

přetížení operátorů (o)

PB161 Programování v jazyce C++ Přednáška 7

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

STL: standardní knihovna šablon

Programování v C++ 1, 1. cvičení

Základy programování (IZP)

C++ objektově orientovaná nadstavba programovacího jazyka C

11. Přehled prog. jazyků

PB161 Programování v jazyce C++ Přednáška 3

Standardní algoritmy vyhledávací.

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Programování v C++, 2. cvičení

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Zpracoval:

Dynamika objektů. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze

map, multimap - Asociativní pole v C++.

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

PB161 Programování v jazyce C++ Přednáška 2

PB161 Programování v jazyce C++ Přednáška 11

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Šablonové metaprogramování v C++ Miroslav Virius KSI FJFI ČVUT

Jazyk C++ I. Šablony 2

Rozsáhlé programy = projekty

18. února 2015, Brno Připravil: David Procházka. Programovací jazyk C++

Objektově orientované programování

Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 /

Teoretické minimum z PJV

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Abstraktní datové typy: zásobník

Skriptovací jazyky. Obsah

PROGRAMOVÁNÍ V C++ CVIČENÍ

Úvod do programovacích jazyků (Java)

Základy objektové orientace I. Únor 2010

Programování v jazyce C a C++

Třetí skupina zadání projektů do předmětu Algoritmy II, letní semestr 2017/2018

Quo vadis programování? Automatizace vyhodnocování studentských úloh

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

přetížení operátorů (o)

typová konverze typová inference

Abstraktní třídy, polymorfní struktury

PROGRAMOVÁNÍ V C++ URČENO PRO VZDĚLÁVÁNÍ V AKREDITOVANÝCH STUDIJNÍCH PROGRAMECH ROSTISLAV FOJTÍK

Virtuální metody - polymorfizmus

IUJCE 07/08 Přednáška č. 6

PROGRAMOVÁNÍ V C++ CVIČENÍ. Michal Brabec

Algoritmizace a programování

PB161 Programování v jazyce C++ Přednáška 9

Základy C++ I. Jan Hnilica Počítačové modelování 18

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

Výrazy, operace, příkazy

Ukazatele, dynamická alokace

Transkript:

Konec a tak PB173 Programování v C++11 Vladimír Štill, Jiří Weiser Fakulta Informatiky, Masarykova Univerzita 15. prosince 2014 Konec a tak PB173 15. prosince 2014 1 / 15

Náplň Perf constexpr initializer list práce s časem hash a hashovací kontejnery regulární výrazy Konec a tak PB173 15. prosince 2014 2 / 15

Perf Linuxový nástroj na profilování kódu. využívá hardwarových počítadel v CPU (rychlé) spouští se utilitou perf s několika podpříkazy top momentální aktivita jednoho (s --pid) nebo všech procesů record zaznamenává aktivitu programu po dobu jeho běhu report analýza zaznamenané aktivity některé funkce (top, analýza systémových volání) vyžadují extra povolení v konfiguraci systému (na FI zakázáno) Konec a tak PB173 15. prosince 2014 3 / 15

Perf: detekce náročných operací Chceme zjistit, které funkce trvají nejdéle a kdo je volá. kompilujeme s -g -fno-omit-frame-pointer v ideálním případě linkujeme s libc a dalšími knihovnami s debug informacemi perf record -a --call-graph fp -a všechna CPU --call-graph fp zaznamenat call graf, použít analýzu frame-pointrů k vytvoření call-grafu (méně přesné, ale nevyžaduje rekompilaci knihoven) vyprodukuje perf.data záznam (lze použít -o soubor) perf report -g -G --stdio k zobrazení záznamu -g zobrazit call-graf -G zobrazovat v grafu volající funkce, ne volané --stdio méně grafický výstup (dlouhé C++ symboly jinak nelze číst) Konec a tak PB173 15. prosince 2014 4 / 15

Perf: demo Měření rychlosti práce s vektorem a deque v C++98 a C++11. cecko.eu perf demo: bench.cpp + Makefile Konec a tak PB173 15. prosince 2014 5 / 15

Perf: demo Měření rychlosti práce s vektorem a deque v C++98 a C++11. cecko.eu perf demo: bench.cpp + Makefile C++98 verze tráví hodně času v copy konstruktorech std::string (při resize std::vector) stejný kód zkompilovaný C++11 je výrazně rychlejší r-value reference mají smysl Konec a tak PB173 15. prosince 2014 5 / 15

constexpr Označení výrazu, že se má vypočítat v době překladu. Lze aplikovat na proměnné Konec a tak PB173 15. prosince 2014 6 / 15

constexpr Označení výrazu, že se má vypočítat v době překladu. Lze aplikovat na proměnné funkce/metody nesmí být virtuální musí vracet LiteralType parametry musí být LiteralType musí mít přesně jeden return (platí do C++14) Konec a tak PB173 15. prosince 2014 6 / 15

constexpr Označení výrazu, že se má vypočítat v době překladu. Lze aplikovat na proměnné funkce/metody nesmí být virtuální musí vracet LiteralType parametry musí být LiteralType musí mít přesně jeden return (platí do C++14) konstruktory Platí podobná omezení jako pro funkce/metody. Pokud nelze poznačenou funkci vykonat v době překladu, stane se z ní inline funkce. Konec a tak PB173 15. prosince 2014 6 / 15

constexpr constexpr int factorial( int n ) { return n > 1? n * factorial( n - 1 ) : 1; } Konec a tak PB173 15. prosince 2014 7 / 15

constexpr constexpr int factorial( int n ) { return n > 1? n * factorial( n - 1 ) : 1; } Napište constexpr funkci Fibonacci. Konec a tak PB173 15. prosince 2014 7 / 15

constexpr constexpr int factorial( int n ) { return n > 1? n * factorial( n - 1 ) : 1; } Napište constexpr funkci Fibonacci. Upravte ji, aby měla lineární složitost. Konec a tak PB173 15. prosince 2014 7 / 15

std::initializer_list Umožňuje inicializovat třídu seznamem hodnot Podobně jako inicializace pole v místě deklarace Konec a tak PB173 15. prosince 2014 8 / 15

std::initializer_list Umožňuje inicializovat třídu seznamem hodnot Podobně jako inicializace pole v místě deklarace Jedná se o kontejner má metody begin, end, size, empty, operator[] Konec a tak PB173 15. prosince 2014 8 / 15

std::initializer_list Umožňuje inicializovat třídu seznamem hodnot Podobně jako inicializace pole v místě deklarace Jedná se o kontejner má metody begin, end, size, empty, operator[] #include <initializer_list> struct A { // bere se hodnotou A( std::initializer_list< int > list ) :...... void add( std::initializer_list< int > list ) {... } }; Konec a tak PB173 15. prosince 2014 8 / 15

Práce s časem hlavičkový soubor <chrono> C++ definuje 3 různé hodiny: std::chrono::system_clock čas systému std::chrono::steady_clock čas, který nelze posouvat (letní čas, přestupné sekundy) std::chrono::high_resolution_clock nejpřesnější čas 1 Každé hodiny mají statickou metodu now, která udává aktuální čas. 1 při práci s malými časovými úseky Konec a tak PB173 15. prosince 2014 9 / 15

Práce s časem hlavičkový soubor <chrono> std::chrono::time_point časový okamžik std::chrono::duration časový úsek výsledek operace rozdílu dvou std::chrono::time_point std::chrono::duration_cast umožňuje definovat rozlišení času std::chrono::hours std::chrono::minutes std::chrono::seconds std::chrono::milliseconds std::chrono::microseconds std::chrono::nanoseconds Konec a tak PB173 15. prosince 2014 10 / 15

Práce s časem měřič času namespace T = std::chrono; class Timer { using Clock = T::high_resolution_clock; using TimePoint = T::time_point< Clock >; TimePoint _starttime, _stoptime; public: void start() { _starttime = now(); } void stop() { _stoptime = now(); } static TimePoint now() { return Clock::now(); } long long elapsed() const { return T::duration_cast< T::milliseconds >( _stoptime - _starttime ).count(); } }; Konec a tak PB173 15. prosince 2014 11 / 15

Hashovací kontejnery obdoba std::set, std::map datové kontejnery používající hash std::unordered_set, std::unordered_map std::unordered_multiset, std::unordered_multimap Konec a tak PB173 15. prosince 2014 12 / 15

Hashovací kontejnery obdoba std::set, std::map datové kontejnery používající hash std::unordered_set, std::unordered_map std::unordered_multiset, std::unordered_multimap nutné specializovat třídu std::hash Případně implmentovat vlastní třídu se stejným rozhraním. mohou být rychlejší nepoužitelné s std::set_union,... Konec a tak PB173 15. prosince 2014 12 / 15

Hashovací kontejnery namespace std { template<> struct hash< A > { size_t operator()( const A &a ) const { size_t h; // výpočet hashe return h; } }; } Konec a tak PB173 15. prosince 2014 13 / 15

Regulární výrazy <regex> std::regex std::regex_match vyhodnotí regex nad celým výrazem (a umožní získat podvýrazy) std::regex_search vyhledávání podle regexu std::regex_replace nahrazení std::regex_iterator postupné hledání několik syntaxí regulárních výrazů: ECMAScript (výchozí), POSIX (extended), awk, (e)grep relativně špatná podpora v kompilátorech (gcc od 4.9, clang jen s libc++, VS) http://en.cppreference.com/w/cpp/regex Konec a tak PB173 15. prosince 2014 14 / 15

Regulární výrazy: demo Parser dynamicky typovaných výrazů ze stringu. Viz cecko.eu, regex.cpp. Konec a tak PB173 15. prosince 2014 15 / 15