CourseWare Wiki
Switch Term
Winter 2021 / 2022
Winter 2020 / 2021
Winter 2019 / 2020
Winter 2018 / 2019
Older
Search
Log In
b181
courses
b6b36pjc
ukoly
jednohubky
Warning
This page is located in archive. Go to the latest version of this
course pages
.
Differences
This shows you the differences between two versions of the page.
View differences:
Side by Side
Inline
Go
Link to this comparison view
Both sides previous revision
Previous revision
2018/12/14 12:43 jerabma7 Autoupdate to version e84192d92869
2018/12/07 16:59 richta [07 – Simulace kovariantních návratových typů s chytrými ukazately]
2018/12/06 23:10 horenmar Autoupdate to version 62486f0
2018/12/01 15:34 horenmar Autoupdate to version 9644b8b
2018/11/23 00:02 jerabma7 [06 – Nevirtuální a virtuální rozhraní]
2018/11/22 23:08 jerabma7 [06 – Nevirtuální a virtuální rozhraní]
2018/11/22 22:08 jerabma7 Autoupdate to version d0f4c9e86d7a
2018/11/15 01:58 jerabma7 Autoupdate to version 44f70cfccc1e
2018/11/08 16:50 jerabma7 Autoupdate to version 0b23f0baaa4d
2018/11/01 00:28 jerabma7 Autoupdate to version faf17e448dc7
2018/10/31 22:35 jerabma7 Autoupdate to version 66281e766cea
2018/10/25 00:42 jerabma7 Autoupdate to version b12a12a4260e
2018/10/17 23:45 horenmar
2018/10/17 23:43 horenmar
2018/10/09 13:42 jerabma7 Autoupdate to version ca01c9c4fa20
Go
Next revision
Previous revision
2018/12/14 12:43 jerabma7 Autoupdate to version e84192d92869
2018/12/07 16:59 richta [07 – Simulace kovariantních návratových typů s chytrými ukazately]
2018/12/06 23:10 horenmar Autoupdate to version 62486f0
2018/12/01 15:34 horenmar Autoupdate to version 9644b8b
2018/11/23 00:02 jerabma7 [06 – Nevirtuální a virtuální rozhraní]
2018/11/22 23:08 jerabma7 [06 – Nevirtuální a virtuální rozhraní]
2018/11/22 22:08 jerabma7 Autoupdate to version d0f4c9e86d7a
2018/11/15 01:58 jerabma7 Autoupdate to version 44f70cfccc1e
2018/11/08 16:50 jerabma7 Autoupdate to version 0b23f0baaa4d
2018/11/01 00:28 jerabma7 Autoupdate to version faf17e448dc7
2018/10/31 22:35 jerabma7 Autoupdate to version 66281e766cea
2018/10/25 00:42 jerabma7 Autoupdate to version b12a12a4260e
2018/10/17 23:45 horenmar
2018/10/17 23:43 horenmar
2018/10/09 13:42 jerabma7 Autoupdate to version ca01c9c4fa20
Go
courses:b6b36pjc:ukoly:jednohubky [2018/12/06 23:10]
horenmar
Autoupdate to version 62486f0
courses:b6b36pjc:ukoly:jednohubky [2018/12/14 12:43]
jerabma7
Autoupdate to version e84192d92869
Line 242:
Line 242:
* ''const int& clamped = clamp(value, 0, 255);'' může vést k chybě. K jaké? Jde to rozumně opravit?
* ''const int& clamped = clamp(value, 0, 255);'' může vést k chybě. K jaké? Jde to rozumně opravit?
+
+
==== 09 – Jednoduché metaprogramování ====
+
+
V této jednohubce se naposled vrátíme k naší implementaci ''vector'' ze
+
cvičení. Poslední, co jsme s ním dělali, byla optimalizace metody
+
''push_back(Iterator, Iterator)'' dle typu iterátoru, kterou dostala.
+
V této jednohubce budeme podobně optimalizovat zvětšování (a kopírování)
+
vektoru v závislosti na typu, pro který je náš ''vector'' instanciovaný.
+
Specificky to znamená, že budeme rozlišovat 3 druhy typů,
+
* Triviálně kopírovatelné typy
+
* Typy, které mají přesunující přiřazení označené jako ''noexcept'' a nejsou triviálně kopírovatelné
+
* Ostatní typy
+
+
a budeme se k nim chtít chovat jinak, když budeme rozšiřovat pole uvnitř
+
vektoru. Specificky, triviálně kopírovatelné typy chceme kopírovat pomocí
+
[[https://en.cppreference.com/w/cpp/string/byte/memcpy|memcpy]],
+
typy, které nejsou triviálně kopírovatelné, ale nemohou vyhodit výjimku
+
při přesunujícím přiřazení, chceme opravdu přesunout a typy, které výjimku
+
vyhodit mohou, chceme prostě zkopírovat.
+
+
+
Projekt s implementací a testy najdete
+
{{:courses:b6b36pjc:ukoly:tiny-09.zip|zde}}.
+
+
Do Brute odevzdejte hlavičky ''array.hpp'', ''vector.hpp'' a případné jiné
+
hlavičky které jste vytvořili.
+
+
+
**K zjištění, jestli je typ triviálně kopírovatelný používejte
+
''pjc::is_trivially_constructible'' z ''pjc-traits.hpp'', a ne
+
''std::is_trivially_constructible''.**
+
+
+
=== Rady ===
+
+
Pro implementaci tohoto úkolu doporučujeme použít SFINAE (viz přednáška),
+
a ne tag dispatch, který byl použit na cvičení.
+
+
Jestli přesunující přiřazení daného typu je noexcept se dá zjistit pomocí
+
traitu [[https://en.cppreference.com/w/cpp/types/is_move_assignable|is_nothrow_move_assignable]]
+
ze standardní knihovny.
+
+
=== Další ===
+
+
Triviálně kopírovatelné typy jsou typy s triviálním kopírovacím
+
konstruktorem a přiřazením. Méně kruhově definováno, jsou to typy
+
u kterých je volání kopírovacích operací ekvivalentní se zkopírováním
+
jejich bitové reprezentace((Toto striktně řečeno není pravda pro typ
+
''trivially_copyable_tracker'', proto jsme zavedli
+
''pjc::is_trivially_constructible'' trait a specializovali ho pro tento
+
typ.)).
+
+
Důvod, proč nechceme přesouvat typy, které mohou vyhodit výjimku je
+
poskytnutí tzv. silné záruky. Detaily jsou v přednášce "Exception Safety",
+
hrubý nástin pak je, že pokud dojde k chybě během zvětšování vektoru,
+
tak se silnou zárukou zůstanou původní prvky zachovány a nepřijdeme o data.
courses/b6b36pjc/ukoly/jednohubky.txt
· Last modified: 2018/12/14 12:43 by
jerabma7