• Nem Talált Eredményt

1. Temporális változók élettartama. C++ programban sokszor használunk temporális változókat, pl. :

N/A
N/A
Protected

Academic year: 2022

Ossza meg "1. Temporális változók élettartama. C++ programban sokszor használunk temporális változókat, pl. :"

Copied!
2
0
0

Teljes szövegt

(1)

1. Temporális változók élettartama.

C++ programban sokszor használunk temporális változókat, pl. : v o i d f (X a1 , X a2 )

{

e x t e r n v o i d g ( c o n s t X& ) ; X z ;

/ / . . .

z = a1 + a2 ; / / z = o p e r a t o r =( o p e r a t o r +( a1 , a2 ) ) ; g ( a1 + a2 ) ;

}

A fenti példában az értékadásnál szükségünk van egy temporális objektumra, amely tartalmazza az a1+a2összeget. Hasonlóan szükségünk van a függvényhívásnál is egy objektumra, amely már tartalmazza a két változó összegét, hogy referencia szerint átadhassuk ag () függvénynek. Tételezzük fel, hogy az Xegy destruktorral rendelkez˝o osztály. A kulcskérdés az, hogy mikor fusson le a temporális objektum destruktora. Kézenfekv˝o válasz az lenne, hogy a blokk végén, mint minden más normális esetben is az objektumot tartalmazó blokk végén hívódik meg a hozzá tartozó destruktor függvény.

A megoldást két esetre kell tesztelni:

• Az els˝o esetben ag () függvény visszaadhat egy pointert, amely a referenciaként átvett temporális változóra mutat, amelyre azf () függvényben még hivatkozhatunk. Ilyenkor azt szeretnénk, hogy a temporális változó hosszú élettartamú legyen.

• A második esetben képzeljük el, hogy1000×1000mátrixokkal képzünk m˝uveleteket, és tucat- nyi temporális mátrixunk keletkezik. Ilyenkor minél el˝obb szeretnénk megszabadulni a temporális objektumoktól, miután már nem hivatkozunk rájuk.

Egy lehetséges megoldást jelentett volna, ha a blokkokkal szabályozzuk a temporális objektumok élet- tartamát:

v o i d f (X a1 , X a2 ) {

e x t e r n v o i d g ( c o n s t X& ) ; X z ;

/ / . . .

{ z = a1 + a2 ; } { g ( a1 + a2 ) ; } }

Az els˝o CFront implementáció a temporlális objektumok destruktorait a blokk végén hívta meg. Sok programozó azonban ennél jobb megoldást követelt. Ezért a következ˝o Annotated C++ Reference Manual- ba (ARM) az került be, hogy a destruktor az objektum keletkezése után a blokk végéig bárhol meghívható, ami egy rossz döntés volt, mert különböz˝o fordító implementációk között a forráskód hordozhatatlanná vált abban az esetben, ha a programozók más-más temporális objektum élettartalommal számoltak. Ha közvetlenül a temporális objektum felhasználása után hívjuk meg a destruktort, akkor a következ˝o kód m˝uködésképtelen:

c l a s s S t r i n g { / / . . . p u b l i c:

f r i e n d S t r i n g o p e r a t o t + ( c o n s t S t r i n g& s1 , c o n s t S t r i n g& s 2 ) ; / / . . .

o p e r a t o r c o n s t c h a r* ( ) ; / / c s t r i n g } ;

1

(2)

v o i d f ( S t r i n g s1 , S t r i n g s 2 ) {

p r i n t f ("%s\n", (c o n s t c h a r* ) ( s 1 + s 2 ) ) ; }

Hasonló programrészek miatt felmerülhet az az ötlet. hogy a temporális objektumokat az ˝oket használó utasítás végen szüntessük meg. Persze erre az esetre is lehet ellenpéldát találni.

v o i d g ( S t r i n g s1 , S t r i n g s 2 ) {

c o n s t c h a r* p = s 1 + s 2 ; p r i n t f ("%s\n", p ) ; }

A C++ szabványosítási bizottság két évig szöszmötölt, míg rávették magukat, hogy lezárják a dolgot.

Abban mindenki megegyezett, hogy tökéletes megoldás nem létezik.

A lehetséges megoldások a temporális objektumok megszüntetésére:

1. az els˝o használat után rögtön 2. az utasítás végén

3. a következ˝o elágazási pont után 4. a blokk végén

5. a függvény végén 6. az utolsó használat után

7. legyen nem definiált, mint amit ARM-ben is szabályként meghatároztak

Az utolsó használat után lév˝o temporális objektum megszüntetése jól hangzik, de a fordítóprogramnak ebben az esetben képesnek kell lenni a program vezérlésszerkezetének elemzésére (control flow analysis), amely implementációs problémákat vet fel. A szabványosítási bizottság sokáig az utasítás végén akarta a temporális objektumokat megszüntetni, de egy újabb probléma merült fel:

v o i d h ( S t r i n g s1 , S t r i n g s 2 ) {

c o n s t c h a r* p ; i f( p = s 1 + s 2 ) {

/ / . . . } }

A fordítógyártók meggy˝ozték a szabványosítási bizottságot, hogy a feltétel rész után a temporális objek- tum sz˝unjön meg, és az elfogadott szabály ezután az lett, hogy ateljes kifejezésvége után kell a temporális objektum destruktorát meghívni.

v o i d f ( S t r i n g s1 , S t r i n g s 2 ) {

c o n s t c h a r* p ;

i f( p = s 1 + s 2 ) p r i n t f ("%s\n", p ) ; / / H i b á s i f( ( p= s 1 + s 2 ) && p [ 0 ] ) { . . . } / / OK

p r i n t f ("%s\n", (c o n s t c h a r* ) ( s 1 + s 2 ) ) ; / / OK S t r i n g s 3 = s 1 + s 2 ;

p r i n t f ("%s\n", (c o n s t c h a r* ) s 3 ) ; / / OK

c o u t << s 1 + s 2 ; / / OK

}

Irodalom: Bjarne Stroustrup, The Design and Evalution of C++ 6.3.2 Lifetime of Temporalis

2

Hivatkozások

KAPCSOLÓDÓ DOKUMENTUMOK

• több-egy (sok-egy, N:1) kapcsolat: egy C-belihez csak egy D-beli tartozhat, de egy D-belihez tartozhat több C-beli is (pl. a Film és a Színész osztályok között lev ˝o

Az akciókutatás korai időszakában megindult társadalmi tanuláshoz képest a szervezeti tanulás lényege, hogy a szervezet tagjainak olyan társas tanulása zajlik, ami nem

Nagy József, Józsa Krisztián, Vidákovich Tibor és Fazekasné Fenyvesi Margit (2004): Az elemi alapkész- ségek fejlődése 4–8 éves életkorban. Mozaik

A kötet második egysége, Virtuális oktatás címmel a VE környezetek oktatási felhasználhatóságával kapcso- latos lehetőségeket és problémákat boncolgatja, azon belül is a

táblázat: Az innovációs index, szervezeti tanulási kapacitás és fejlődési mutató korrelációs mátrixa intézménytí- pus szerinti bontásban (Pearson korrelációs

• A progresszív mondat olyan kategorikus állítás, amelynek topikja temporális topik.. b) Lois wishes to meet a bachelor → Lois wishes to meet an unmerried man. c) Lois wishes

elhelyezkedő daganat esetében (pl. centrális, subcorticalis, temporális lokalizáció) a különböző kezelések, illetve beavatkozások (pl. biopszia, műtét,

Glasbey szerint a fenti mondatnak több olvasata létezik attól függően, hogy mivel azonosítjuk a TTI-t. Az egyik olvasat esetében arra kérdezünk rá, hogy valaha olvasta-e