A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

Hasonló dokumentumok
Mutatók és mutató-aritmetika C-ben március 19.

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

8. gyakorlat Pointerek, dinamikus memóriakezelés

Programozás II. 4. Dr. Iványi Péter

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Programozás alapjai. 10. előadás

C programozási nyelv Pointerek, tömbök, pointer aritmetika

A programozás alapjai

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

Bevezetés a C++ programozási nyelvbe

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Programozási nyelvek a közoktatásban alapfogalmak II. előadás

Programozási nyelvek Java

Hatékony memóriakezelési technikák. Smidla József Operációkutatási Laboratórium január 16.

Programozási nyelvek Java

Pénzügyi algoritmusok

A C programozási nyelv III. Pointerek és tömbök.

A C programozási nyelv III. Pointerek és tömbök.

Alkalmazott modul: Programozás 8. előadás. Strukturált programozás: dinamikus memóriakezelés. Dinamikus memóriakezelés. Dinamikus memóriakezelés

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

Objektumorientált Programozás VI.

Szövegek C++ -ban, a string osztály

C memóriakezelés. Mutató típusú változót egy típus és a változó neve elé írt csillag karakterrel hozhatjuk létre.

Programozas 1. Strukturak, mutatok

Alprogramok fordítása. Kódgenerálás II. (alprogramok, memóriakezelés) Függvény, eljárás. Alprogramok írása assemblyben

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

Bevezetés a programozásba. 8. Előadás: Függvények 2.

Fordító részei. Fordító részei. Kód visszafejtés. Izsó Tamás szeptember 29. Izsó Tamás Fordító részei / 1

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

Alkalmazott modul: Programozás 10. fejezet. Strukturált programozás: dinamikus memóriakezelés. Giachetta Roberto

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

1. Alapok. Programozás II

A C programozási nyelv II. Utasítások. A függvény.

Emlékeztető: a fordítás lépései. Szimbólumtábla-kezelés. Információáramlás. Információáramlás. Információáramlás.

Adatszerkezetek 1. Dr. Iványi Péter

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás

A függvények névvel rendelkező utasításcsoportok, melyeknek információkat adhatunk át, és van egy visszatérési értékük.

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Bevezetés a programozásba I.

Rekurzió. Dr. Iványi Péter

Programozási Nyelvek: C++

Operációs rendszerek III.

Adatszerkezetek Adatszerkezet fogalma. Az értékhalmaz struktúrája

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Verem Verem mutató 01

A C programozási nyelv I. Bevezetés

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Osztályok. 4. gyakorlat

A C programozási nyelv I. Bevezetés

JAVA PROGRAMOZÁS 2.ELŐADÁS

Aritmetikai kifejezések lengyelformára hozása

10. gyakorlat. Pointerek Tárolási osztályok

C++ programozási nyelv Konstruktorok Gyakorlat

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Programozás C++ -ban

Programozás I. 5. Előadás: Függvények

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

Programozás II. 2. Dr. Iványi Péter

Bonyolultságelmélet. Monday 26 th September, 2016, 18:50

Kivételkezelés a C++ nyelvben Bevezetés

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Bevezetés a programozásba. 9. Előadás: Rekordok

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r

Máté: Számítógép architektúrák

Mi az assembly? Gyakorlatias assembly bevezető. Sokféle assembly van... Mit fogunk mi használni? A NASM fordítóprogramja. Assembly programok fordítása

C++ Gyakorlat jegyzet 5. óra. A C++ szabvány több memóriatípust különít el. Ezek közül elsősorban a stack-et használtuk eddig.

7. fejezet: Mutatók és tömbök

Bevezetés a programozásba Előadás: A const

Adatbázis és szoftverfejlesztés elmélet

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

Java II. I A Java programozási nyelv alapelemei

Alprogramok, paraméterátadás

Informatika terméktervezőknek

Programozás I gyakorlat

Programozás alapjai II. (7. ea) C++

Rekurzió. Működése, programtranszformációk. Programozás II. előadás. Szénási Sándor.

OOP #14 (referencia-elv)

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

5-6. ea Created by mrjrm & Pogácsa, frissítette: Félix

Készítette: Nagy Tibor István

Memóriakezelés, dinamikus memóriakezelés

Teljesítmény Mérés. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Teljesítmény Mérés / 20

Bevezetés, a C++ osztályok. Pere László

1. Bevezetés A C++ nem objektumorientált újdonságai 3

Kivételek, kivételkezelés a C++ nyelvben

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Függvények. Dr. Bécsi Tamás 6. Előadás

Programozás alapjai. 7. előadás

Pointerek C-ben, C++-ban

C++ programozási nyelv Konstruktorok-destruktorok

Kifejezések. Kozsik Tamás. December 11, 2016

Átírás:

A verem (stack) A verem egy olyan struktúra, aminek a tetejére betehetünk egy új (vagy sorban több) elemet a tetejéről kivehetünk egy (vagy sorban több) elemet A verem felhasználása Függvény visszatérési címe ide kerül 1 Függvényparaméterek ebbe kerülnek Lokálisan deklarált változók Operátorok kiértékelése itt történik Függvény visszatérési értéke ennek a tetejére kerül 1 Ennek a mikéntjét most nem tárgyaljuk

A verem működése kétparaméteres művelet végzésekor i n t a ; a = 1 + 2 ; A program fenntart egy helyet a lokális változónak Beteszi a konstansokat a verem tetejére Kivesz a verem tetejéről két számot Elvégzi velük a műveletet Leteszi az eredményt a verem tetejére Beálĺıtja a változó értékét A verem alakulása: 2 1 a =? + operátor: két elemet kivesz, egyet betesz 3 a =? értékadás: egy elemet kivesz, lokális változó értékét beálĺıtja a = 3

A verem működése függvényhíváskor A hívó kód leteszi az összes függvényparamétert a verembe, egyesével, a sorrendre ügyelve A hívó kód meghívja a függvényt A hívott függvény elvégzi a műveleteket Eközben a veremből kiszedegeti az összes paramétert Hozhat létre lokális változókat A végeredményt beteszi a verembe tetejére, ez a visszatérési érték Visszatér a hívó függvényhez, amelyik a verem tetején találja a visszatérési értéket

Tudnivalók 1. A függvény sosem áshat mélyebbre a veremben, mint ahol a verem teteje a függvényhívás előtt volt 2. Egy függvény meghívása után mindig leüríti a vermet addig, ameddig a függvényhívás előtt volt: kiveszi az összes paraméterét és lokális változóját 3. Függvényparaméterek ebbe kerülnek 4. Visszatéréskor a függvény mindig leteszi a visszatérési értéket a verem tetejére 5. Ha egy paramétert érték szerint adunk át, akkor az bemásolódik a verembe 6. Ha cím szerint adunk át egy paramétert, akkor annak csak a mutatója másolódik be a verembe

A halomterület (heap) A verem nagyon gyorsan elérhető (mindig tudjuk, hol a teteje) véges méretű (a program előre fix méretet foglal neki) lefoglalása: lokális változó deklarálása függvény visszatérésekor a lokális változók elvesznek Ha nagy memóriaterületre van szükség a halomterületről (heap) lehet lefoglalni malloc, realloc stb. függvények free függvény - kézzel kell felszabadítani! a heap tartalmára csak pointereken keresztül hivatkozhatunk

A heap A heap elérése lassú: Foglaláskor meg kell nézni, hogy van-e elég nagy egybefüggő terület Le kell könyvelni a foglalásokat és felszabadításokat Használatkor pointert kell feloldani, ez lassú (stack esetében csak ki kell kapni az értéket a legtetejéről) Előnye: Megmarad függvényhívások között is, hiszen nem a stack-en van lekönyvelve Problémák Sok foglalás és felszabadítás: a memória felaprózódik Nem lesz elég hely egy nagy, egybefüggő blokk lefoglalására Memória-fragmentáció

Tömbök allokálása a stack-en double a [ 1 2 ] ; emiatt csak lokális függvény látja, hiszen a stack leürül visszatérés előtt return &a; értelmetlen címet ad vissza, hiszen a stack-re mutat, ami már leürült mivel a stack-en szűkös a hely, csak kicsi lehet viszont gyors az elérése Figyelem: a szögletes zárójelek között csak konstans állhat! GCC lefordítja, ha ott változó áll, de ez nem szabványos más fordítók meghalnak tőle (pl. Intel C)

Tömbök allokálása a stack-en double a [ 3 ] [ 5 ] ; ez 3 5 = 15 db 8 bájtos blokkot foglal a stack-en mindig a legutolsó index szerint jönnek sorban az elemek [0][0] [0][1] [0][2] [0][3] [0][4] [1][0] [1][1] [1][2]...

Stack-en allokált tömbök Stack-en allokált tömbök átadhatók függvénynek A mérete csak konstans lehet GCC erre tud egy trükköt, de megint csak nem szabványos! i n t myfunc ( double b [ 1 2 ] ) {... } i n t main ( ) { i n t a [ 1 2 ] ;... myfunc ( a ) ; }

Többindexes tömbök allokálása heap-en double a ; a = ( double ) m a l l o c (N s i z e o f ( double ) ) ; f o r ( i = 0 ; i < N; i ++) { a [ i ] = ( double ) m a l l o c (M s i z e o f ( double ) ) ; } Problémák: Ez M + 1 memóriallokációval jár Korábban láttuk, hogy ez lassú, és fragmentálja a memóriát A lineáris algebra csomagok (pl. LAPACK) nem szeretik