# Paměť ## Objekty ### Připomenutí: objekt │ • objekt je zobecnění paměti │ • vzniká «deklarací proměnné» │ • ukládá «hodnotu» (ne bajty!) │ • může mít přidělenu adresu (má-li objekt adresu, může na něj existovat ukazatel; existuje-li ukazatel, objekt musí mít adresu) ### Paměť │ • „pole bajtů“ │ • adresa ~ index │ • bajt ~ ‹unsigned char› (paměť je efektivně pole bajtů, adresy hrají roli indexů; na úrovni C odpovídá bajtu – nejmenší adresovatelné jednotce – typ ‹unsigned char›) ### Překrývání (aliasing) │ • objekty se stejnou adresou │ • typicky není dovoleno │ • výjimky: │ ◦ kompatibilní typy │ ◦ reprezentace ### Reprezentace objektu │ • bajty objektu = reprezentace │ • reprezentace je sama objektem │ • kódování definováno implementací │ • nemusí být jednoznačná ### XXX │ • objekt a reprezentace sdílí adresu │ • ukazatele mají různé typy │ • lze bezpečně přetypovat │ ◦ reprezentace → ‹unsigned char *› ### Nepovolené překrývání │ • není-li povoleno, je zakázáno │ • povoleno je: │ ◦ objekt a jeho reprezentace │ ◦ ### Ukazatel bez typu │ • ‹void *› – neurčuje typ objektu │ • není dovoleno dereferencovat │ • povoluje implicitní přetypování │ • nesmí porušit pravidla o překrývání ### Vznik objektu │ • paměť ~ │ • zápisem reprezentace │ ◦ kopie po bajtech │ ◦ přiřazení ### Neplatné objekty │ • objekt lze konstruovat z bajtů │ • ne každá reprezentace je platná │ • použití neplatného objektu → UB