EPC úloha 2: statický vektor
Konec 12. týdne semestru, podle kalendáře neděle 13. 12. 2026. Datum si ověř. Úloha je za 10 bodů a soupis obsahuje body k pochopení, ne řešení.
Co máš odevzdat
Třídní šablonu epc::vector<T, N> s pevnou kapacitou , úložištěm uvnitř objektu a podporou přesunu.
Co musíš pochopit
- Úložiště je v objektu: pole
unsigned charnebostd::bytesalignas(T). Jiné členské proměnné než úložiště a počet prvků nesmíš mít. - Přesun vektoru nejde provést převzetím ukazatele. Přesouvají se jednotlivé prvky.
std::moveu typu bez přesunu vede na kopii. Díky tomu stačí jeden kód pro tři druhy typů.- Plný vektor vyhazuje
std::bad_alloca zůstává beze změny. - Proč přesun a
swapnejsounoexcept: u kopírovatelného typu se kopíruje a kopie může selhat.
Co si zopakovat
| Co | Kde |
|---|---|
| Hodnotové kategorie a reference | kapitola Hodnoty, reference a přesun |
| Přesouvací speciální funkce | ni_epc_06 strany 17–35 |
| Moved-from stav | ni_epc_06 strany 25–26 |
| Self-assignment při přesunu | ni_epc_06 strany 28–31 |
| Zarovnání | kapitola Objekty a úložiště |
Doporučené pořadí
- Zkopíruj kostru z úlohy 1 bez dynamické paměti.
- Úložiště,
data,capacity,size. push_backkopií a přesunem.- Kopírovací a přesouvací konstruktor.
pop_back,clear, statickéreserve.- Oba přiřazovací operátory.
swappro vektory různé velikosti.- Testy pro všechny tři druhy typů.
Na co si dát pozor
reserveje statická a pro nic nedělá, jinak vyhodístd::bad_alloc.v = std::move(v)musí nechat platný stav.- Vektor nikdy nevolá alokační funkce.
- Kapacita se bere z , neukládej ji do proměnné.
- Vektory mohou mít různou velikost, takže
swapmá dvě části: prohození společných prvků a přesun zbytku. - Typ bez výchozího konstruktoru a s vyšším zarovnáním musí fungovat. Na rozdíl od úlohy 1 není zarovnání omezené.
Jak testovat
Potřebuješ tři typy:
- pouze přesouvatelný (například
std::unique_ptr<int>) - přesouvatelný i kopírovatelný s počítadlem kopií
- pouze kopírovatelný
Přidej typ s alignas(64) a kontrolu, že data() je zarovnaná. Měř, že se u druhého typu nikde zbytečně nekopíruje.
Kontrola před odevzdáním
- Funguje s
std::unique_ptr. - Žádné alokace (ověř přetížením
operator newv testu). -
sizeofobsahuje jen úložiště a počet prvků. -
swapfunguje pro různé velikosti. -
push_backna plném vektoru vyhodístd::bad_alloca nic nezmění. - Sanitizery nic nehlásí.