Čo ak program potrebuje pamäť, ktorej veľkosť závisí od konkrétneho vstupu?

Podobné dokumenty
Programovanie v jazyku C - to chce dynamiku

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

Dynamická alokácia pamäte a smerníky

Úroveň strojového kódu procesor Intel Pentium. Adresovanie pamäte

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

Správa paměti. Ing. Marek Běhálek katedra informatiky FEI VŠB-TUO A-1018 / marek.behalek@vsb.

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

Textový editor WORD. Práca s obrázkami a automatickými tvarmi vo Worde

Správa paměti. Ing. Marek Běhálek katedra informatiky FEI VŠB-TUO A-1018 /

PODPROGRAMY. Vyčlenenie podprogramu a jeho pomenovanie robíme v deklarácii programu a aktiváciu vykonáme volaním podprogramu.

Krok 1 Pochopenie systémov. Krok 2 Hodnotenie silných a slabých stránok. Krok 3 Zber podkladov. - hodnotenie - overenie - postupy a smernice

MATLAB (1) - úvod do programovania vedeckých problémov. LS 2017, 8.predn.

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

Správa paměti. Správa paměti. (c)marek Běhálek, Katedra informatiky FEI VŠB-TU Ostrava 1. Motivace. Úrovně správy paměti. Obsah přednášky.

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

Microsoft Outlook. Stručný prehľad základných funkcií. Ing.Anna Grejtáková, SPP DFBERG

Objektovo orientované programovanie v C# ERIK KUČERA METÓDY VÝPOČTOVEJ INTELIGENCIE PREDNÁŠKA 3

Více o konstruktorech a destruktorech

Hromadná korešpondencia v programe Word Lektor: Ing. Jaroslav Mišovych

Task, async, await METÓ DY VÝPOČTOVEJ INTELIGENCIE A C# FA K ULTA E L E K T ROTECHNIKY A INFORMATIKY S LOVENSKÁ T E CHNICKÁ U NIVERZITA

Zachovanie mentálnej mapy pri interakcií s grafom. RNDr. Jana Katreniaková PhD.

8. Relácia usporiadania

Př. další použití pointerů

Obsah. Reprezentácia údajov v počítači. Digitalizácia číselnej informácie. Digitalizácia znakov a textovej informácie.

Programovanie v jazyku C - pole treba poorat...

Generické programování

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Inventúra účtov- základný popis.

Konstruktory a destruktory

Stiga Autoclip 200 Series

Základy algoritmizácie a programovania

VECIT 2006 Tento materiál vznikol v rámci projektu, ktorý je spolufinancovaný Európskou úniou. 1/4

Funkcia - priradenie (predpis), ktoré každému prvku z množiny D priraďuje práve jeden prvok množiny H.

Mělká a hluboká kopie

Úvodná strana IS ZASIELKY Prvky úvodnej stránky:

Polia a matice v jazyku C. Michal Kvasnica

Naformátuj to. Naformátuj to. pre samoukov

Abstraktní třídy, polymorfní struktury

KOMISNÝ PREDAJ. Obr. 1

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

Riešenie cvičení z 3. kapitoly

Užívateľská príručka systému CEHZ. Základné zostavy Farmy podľa druhu činnosti

Jazyk C++ I. Šablony 2

Segmentovanie a stránkovanie v procesoroch Intel Pentium

Základy programování (IZP)

TomTom Referenčná príručka

1. LABORATÓRNE CVIČENIE

Operační systémy. Cvičení 4: Programování v C pod Unixem

MANUÁL K TVORBE CVIČENÍ NA ÚLOHY S POROZUMENÍM

RIEŠENIE NIEKTORÝCH ÚLOH LINEÁRNEJ ALGEBRY V PROSTREDÍ MS EXCEL. 1. Zadáme prvky matice A a B do buniek pracovného hárku zošita MS Excel

Skákalka. Otvoríme si program Zoner Callisto, cesta je Programy Aplikácie Grafika Zoner Callisto.

Spojová implementace lineárních datových struktur

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.

Strojový kód, assembler, emulátor počítača

ONLINE POBOČKA. pre zamestnávateľov MANUÁL

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

1. Gigabajty si hneď v prvom kroku premeníme na gigabity a postupne premieňame na bity.

Práce s polem a pamětí

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

Vysoké školy na Slovensku Prieskum verejnej mienky

Referenčná ponuka na prístup ku káblovodom a infraštruktúre. Príloha 7 Poplatky a ceny

Jednoduchá správa pamäte

Organizačné štruktúry.

Pointery II. Jan Hnilica Počítačové modelování 17

Blokové a prúdové šifry

Multiplexor a demultiplexor

Moderné vzdelávanie pre vedomostnú spoločnosť/projekt je spolufinancovaný zo zdrojov EÚ. Grafy

Operačný systém Úvodná prednáška

Chování konstruktorů a destruktorů při dědění

Užívateľská príručka k funkcii Zastavenie a pretočenie obrazu

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Dědění, polymorfismus

Import Excel Univerzál

Návrh postupu pre stanovenie počtu odborných zástupcov na prevádzkovanie verejných vodovodov a verejných kanalizácií v správe vodárenských spoločnosti

MQL4. MQL4 MQL4 MQL4 MQL4 MQL4 Script MQL4 MQL4 MQL4 MQL4 MQL4 MQL4 MQL4 MQL4. MQL4 MQL4 MQL4 MQL4 Indicator MQL4 MQL4 MQL4 MQL4 MQL4 EA

Zvyškové triedy podľa modulu

Externé zariadenia Používateľská príručka

SKLENENÝ PRÍSTREŠOK MAR70/A

Programování v jazyce C a C++

Modul PROLUC Podvojné účtovníctvo

BusinessBanking Lite a SEPA Uistite sa, že ste pripravení

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

Téma : Špecifiká marketingu finančných služieb

24. listopadu 2013, Brno Připravil: David Procházka

Návod na viacnásobné podpisovanie dokumentov prostredníctvom aplikácie D.Signer/XAdES v prostredí elektronickej schránky

Automatizovaný informačný systém technických kontrol

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele

Práce s pamětí a předávání parametrů. Úvod do programování 1

D.Viewer2 Používateľská príručka

7.1 Návrhové zobrazenie dotazu

Dell S2718H/S2718HX/S2718HN/ S2718NX Dell Display Manager Návod na obsluhu

Metóda vetiev a hraníc (Branch and Bound Method)

6. lekce Úvod do jazyka C knihovny datové typy, definice proměnných základní struktura programu a jeho editace Miroslav Jílek

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

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

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

Prínosy energetického manažmentu.

Manuál Klientska zóna

Základy programování (IZP)

Transkript:

SPRÁVA PAMÄTE

Čo ak program potrebuje pamäť, ktorej veľkosť závisí od konkrétneho vstupu? a.) Programátor môže odhadnúť maximálnu možnú veľkosť a vyhradiť tento priestor v statických premenných (riešenie jazyka Fortran) b.) Program si môže vyžiadať (alokovať) pamäť v run-time.

Problém dynamickej pamäte Počítač/program má k dispozícii len lineárnu pamäť. T.j. postupnosť adries kam sa dá uložiť jeden byte. Počítač vie čítať a zapísať 1, 2, 4 a 8 po sebe nasledujúcich bytov. 0x000000 0x000001 0x000004 0x000008 0x000010 0 1 1 0 1 0 1 0 0xffffffff

Správa pamäte Program počas behu zvyčajne požaduje kusy a kúsky pamäte rôznych veľkostí. Program požaduje stále novú a novú pamäť, pričom možno predtým alokované kúsky už nikdy nebude potrebovať. Ak by sa pamäť nejakým spôsobom "nerecyklovala", skôr alebo neskôr by došlo k zaplneniu všetkej fyzickej pamäte alebo vyčerpaniu celého adresného priestoru. T.j.: Správa pamäte je systém s minimálne dvomi operáciami: alokovanie a uvoľňovanie pamäte.

Riešenie jazyka C Pamäť alokovaná cez mmap Adresný priestor programu kód programu statické premenné Alokovanie/uvoľňovanie na úrovni byte-ov: void *malloc(int size) void *realloc(void *p, int size) void free(void *p) Alebo nízkoúrovňové alokovanie/uvoľňovanie na úrovni stránok pamäte (t.j. násobky 4KB alebo 4MB): void *mmap( parametre ) void munmap(void *p, int size) zásobník: lokálne premenné funkcií ( automatické premenné), parametre funkcií, návratové adresy,...

Príklad Predstavme si program, ktorý implementuje dátovú štruktúru "graf", tak že každý vrchol obsahuje pole smerníkov na susedné vrcholy. struct vrchol { int cislo; struct vrchol **susedia; ;

0 0 1 2 3 1 2 3

0 0 1 1 2 2 0 1 2

0 0 1 1 2 2 0 1 2

0 0 1 1 2 2 0 1 2

0 0 1 1 2 2 0 1 2

Riešenie jazyka C++ adoptovanie funkcíí malloc, realloc, free, mmap, munmap z C zavedenie nadstavby nad týmito operáciami vo forme operátorov new a delete a možnosť ich preťaženia (overloading of new and delete). Navyše možnosť špecifikovať initializáciu pri novo alokovanej pamäti a "deinitializáciu" pred jej uvoľnením (konštruktory, deštruktory).

Operátor new a delete class A { public: int x; A() { x = 0; ; int main() { A *a; a = new A();... delete a; Vyvolanie new spája dve funkcie: - alokovanie pamäte - vyvolanie konštruktora (ak existuje) Vyvolanie delete spája dve funkcie: - vyvolanie deštruktora (ak existuje) - uvoľnenie pamäte

Konštruktory a deštruktory class A { int x; public: A() { printf("a() "); A(int i) { printf("a(%d) ", i); ~A() { printf("~a() "); ; int main() { A *a = new A(); delete a; int main() { A *a = new A(1); delete a;

Užívateľom definované operátory new a delete class A { int x; public: void *operator new(size_t size) { printf("new(%d) ", size); return(malloc(size)); void operator delete(void *p) { printf("delete(%p) ", p); free(p); A() { printf("a() "); A(int i) { printf("a(%d) ", i); ~A() {printf("~a() "); ; int main() { A *a = new A(); delete a; int main() { A *a = new A(1); delete a;

Užívateľom definované operátory new a delete class A { int x; public: void *operator new(size_t size) { printf("new(%d) ", size); return(malloc(size)); void operator delete(void *p) { printf("delete(%p) ", p); free(p); A() { printf("a() "); A(int i) { printf("a(%d) ", i); ~A() {printf("~a() "); ; int main() { A *a = new A(); delete a; Vypíše: new(4) A() ~A() delete(0x8557008) int main() { A *a = new A(1); delete a; Vypíše: new(4) A(1) ~A() delete(0x9345008)

Oddelená alokácia a initializácia, príklad class A { int x; public: void *operator new(size_t size) { printf("new(%d) ", size); return(malloc(size)); void operator delete(void *p) { printf("delete(%p) ", p); free(p); int main() { A x; A *y = new A(1); delete y; Vypíše: A() new(4) A(1) ~A() delete(0x9d4b008) A() { printf("a() "); A(int i) { printf("a(%d) ", i); ~A() {printf("~a() "); ;

Operátor delete pre polia int main() { A *a; a = new A[10];... delete [] a; Vyvolanie new: - alokovanie pamäte - vyvolanie konštruktora (ak existuje) pre každý prvok pola Vyvolanie delete: - vyvolanie deštruktora (ak existuje) pre každý prvok poľa - uvoľnenie pamäte

Užívateľom definované operátory new a delete pre polia class A { ; void *operator new[](size_t size) {... void operator delete[](void *p) {...

Užívateľom definované operátory new a delete pre polia, príklad class A { int x; public: void *operator new(size_t size) { printf("new(%d) ", size); return(malloc(size)); void *operator new[](size_t size) { printf("new[](%d) ", size); return(malloc(size)); int main() { A *a = new A[5]; delete [] a; ; void operator delete(void *p) { printf("delete "); void operator delete[](void *p) { printf("delete[] "); A() {printf("a() "); ~A() {printf("~a() ");

Užívateľom definované operátory new a delete pre polia, príklad class A { int x; public: void *operator new(size_t size) { printf("new(%d) ", size); return(malloc(size)); void *operator new[](size_t size) { printf("new[](%d) ", size); return(malloc(size)); ; void operator delete(void *p) { printf("delete "); void operator delete[](void *p) { printf("delete[] "); A() {printf("a() "); ~A() {printf("~a() "); int main() { A *a = new A[5]; delete [] a; Vypíše: new[](24) A() A() A() A() A() ~A() ~A() ~A() ~A() ~A() delete[]

Preťaženie (overloading) operátora new class A { public: void *operator new(size_t size) { printf("new(int) "); return(malloc(size)); void *operator new(size_t size, int x) { printf("new(int, int) "); return(super_malloc(size)); A(int y) {printf("a(int) "); A(int x, int y) {printf("a(int,int) "); ; int main() { A *a; a = new A(1); a = new(1) A(2); Vypíše: new(int) A(int) new(int, int) A(int)

Preťaženie operátora delete? Neexistuje Allokátor musí uložiť do pamäte všetku informáciu potrebnú na uvoľnenie.

Nedostatok pamäte Ak operátor new vráti NULL (t.j. 0), tak konštruktor sa nevyvolá. set_new_handler ( void (*handler)() ) umožňuje definovať funkciu, ktorá sa vyvolá ak alokácia zlyhala. Je to pozostatok z čias, keď v C++ neboli výnimky.

Symetria/asymetria new, delete a konštruktorov, deštruktorov Konštruktory môžu byť preťažené, operátor new tiež Deštruktory nemôžu byť preťažené, operátor delete tiež nie. Konštruktory nemôžu byť virtuálne, operátor new tiež nie. Avšak! Deštruktory môžu byť virtuálne. Operátor delete nemôže byť deklarovaný ako virtual, ale vyvolá sa operátor delete z triedy, z ktorej sa vyvolal deštruktor (de-facto deštruktor vyvolá "svoj" delete).

Dynamická alokácia pamäte v zásobníku void fun(int x) { int a[x];... Obe tieto konštrukcie sú povolené v C aj v C++ void fun(int x) { int *a; a = malloca(x * sizeof(int));...

Diskusia Pri programovaní často nevieme či už môžme nejaký kus pamäte uvoľniť alebo nie. Zvyčajne pri komplikovaných zdielaných dátových štruktúrach nie je jasné či nejaká časť štruktúry je ešte niekde použitá alebo nie. Ak miesto uvoľníme (free, delete), a potom ho použijeme cez nejaký zabudnutý smerník... Ak ho neuvoľníme možno spôsobíme nekontrolovanú spotrebu pamäte (memory leak).

Správa pamäte v jazykoch Java, C# Built-in operácia new a úplne automatizované uvoľňovanie nepoužitej pamäte (Automatic garbage collection). Implikácie pre jazyk: 1) Žiadna smerníková aritmetika 2) Zakázanie netypových parametrov (printf,...) 3) Kontrola indexov polí --> pointre strácajú zmysel a sú skryté

GC obrázok Adresný priestor programu kód programu statické premenné zásobník

Je možné automatické uvoľňovanie pamäte v C/C++? Problém: ako identifikovať, kde v pamäti sú uložené smerníky (pointre) a kde iné dátové typy?

Boehmov konzervatívny GC pre C/C++ Predpokladá, že pointre nevznikajú ako výsledok aritmetických operácií Funguje nasledovne: prehľadá statické dáta a zásobník a každú štvoricu byte-ov považuje za smerník. Ak tento "smerník" ukazuje na alokovanú pamäť usúdi, že pamäť je ešte dostupná. Následne prehľadáva všetky dostupné alokované časti a podobne interpretuje každú štvoricu bytov v nich ako smerníky. Ak ukazujú na alokovanú pamäť pridáva ju k dostupnej pamäte. Ak prehľadal všetky dostupné kusy pamäte, zvyšnú pamäť považuje za nedostupnú a uvoľní ju.