Amiga + C++

Saku-foorumi » Classic Amiga » Ohjelmointi » Viestit 2004 » Amiga + C++ « Edellinen Seuraava »

Kirjoittaja Viesti
 

miksuh
Torstaina, 4. syyskuuta, 2003 - klo 9.06:   
Totanoin pari hommelia. C++:lla on tullut jotain vähän tehtyä, mutta Amigalla vaan C:llä. Mutta ajattelin tutkia josko siirtys kotonakinn C++:n. mut pari juttua:

Ensinnäkin C++:n dynaaminen muistinvaraushan on aika erilainen kun C:ssä. C:llä homma hoituu malloc():lla tai Amigassa esim AllocVec():llä ja AllocPooled():lla, mulla itselläni on yleensä ollu ohjelmissani memory-moduuli missä määriteltynä AllocVecPooled() mitä käyttäny kikkialla.

Mutta siis C++:ssahan muistinvaraus hoidetaan tyyliin s = new char[10] jne... Mites pitäskö Amigalle koodatessa vaan yksinkertasesti unohtaa tommoset C++:n ominaisuudet, kun eihän toi anna mitään mahdollisuutta valita mistä ja miten se muisti varataan... Tosin eihän se malloc():kaan ole C:n puolella suositeltava Amigalla, mutta toi C++:n tyyli on iha erilainen..

Lista muista vastaavista jutuista olis kiva, eli mikä kannattaa enemmin tehdä Amigamaisesti, eikä C++:n tyylillä.
Eli esim miten MUI-ohjelmointi C+:lla eroo vastaavasta c:n kanssa jne. Nykysiä tekeillä olevia juttuja en ala siirtään C++:n, muutenki sitä pitää harjotelkla eka ennenkun kannattaa. Mut ehkä joskus C on vaihtunu C++:ksi kokonaan.

Sit yks juttu vielä. tein Amigan GCC:llä yksinkertasen testin. Tein HelloWorldin sekä C:llä, että C++:lla. Sanokaas joku mite ihmeessä toi on selitettävissä:

http://www.saunalahti.fi/~miksuph/cpp/wtf

Siis mite ihmeessä tosta C++ versiosta tulee NOIN paljon isompi ????????? Kummanki version kohdalla -s strippaa debug tiedot pois eksestä muuten olisivat kumpikin paljon isompia. Foorumin takia joutu vähä hm muotoileen noita listauksia :)

Tai siis empäs muokannutkaa noita, kun pistin toisaalle webbii ku kyllästyin tappelee foorumin kansaa. Se ei oikee sovi ohjelmalistausten postauksee tosiaankaa :P

[Edit: Neljä viestiä yhdistetty. -Thoriel]

 

JPQ
Torstaina, 4. syyskuuta, 2003 - klo 12.02:   
miksuh: en tiedä joku gurumpi voisi tietää ehkä osaako cout enempi kuin printf ?

 

Jon
Torstaina, 4. syyskuuta, 2003 - klo 15.13:   
Muistinvaraus: tee luokat new:llä ja varaa Amiga-jutut AmigaOS-kutsuilla (esim. konstruktorissa). Vapauta resurssit destruktorissa. Tuohon koko asiaan en osaa vastata mutta luulisin että erot pienenevät sovelluksen kasvaessa. Hello World ei ole oikein hyvä testisovellus IMO :)

...Kyllä siellä enemmän tavaraa on, jotain streameihin liittyvää ja esim '<<' operaattorit yms. Paha sanoa kun ei tiedä tarkemmin C++-kääntäjän sielun elämää.

Mitä olen nähnyt asiantuntijoiden lukuja, niin kuulemma C++-exen koko saattaa olla jotain 95%-105% C-kielisestä vastaavasta.

 

JPQ
Torstaina, 4. syyskuuta, 2003 - klo 15.48:   
Ja toisaalta GCC ainakin taitaa tehdä isoa koodia käänämpä noi teidän mieliksi myös hisoft c++:salla tässä jossain välissä luulen jo tänään.

 

itix
Torstaina, 4. syyskuuta, 2003 - klo 16.17:   
Käytännössä on ihan sama varaako muistia malloc():lla, AllocMem()/AllocPooled() kutsulla tai new:llä. malloc() ja new kutsuu viimekädessä Execin AllocPooled() tai AllocVec() funktioita kuitenkin. Portattavuuden kannalta new on paras mutta jos ohjelma käyttää AmigaOS-featureita (MUI, Reaction, AHI) niin sehän on sitten aivan sama.

Joten minun mielestä on paras käyttää sitä tapaa mistä itse eniten tykkää. Itse tykkään käytellä suoraan Execin ja DOS:n funktioita (Open(), Close(), Write() jne.) koska sillä pääsee lähemmäksi käyttöjärjestelmää. Mutta ihan makuasia se on.

 

miksuh
Torstaina, 4. syyskuuta, 2003 - klo 16.33:   
JPQ: No siis C:tä käytettäessä GCC ei tee mitenkään isoa koodia. Toi C++ koodin koko oli kyllä melkonen yllätys. Mut siis debug-infot strippaamalla exen koon saa pienemmäksi. Ainakin C-version helloworldista voi puristaa GCC:llä pariin sataan tavuun tjsp kunhan asettaa käsin exeen mukaan otettavat startupfileet, oletuksena tulee mukaan enemmän kamaa kun on ihan pakko.

 

miksuh
Torstaina, 4. syyskuuta, 2003 - klo 16.34:   
itix: Lähinnä mua mietityttää just se jos haluaa käyttää noita pooled-hommia eli siis muistipooleja. Mulla on ollu tapana yrittää käyttää pooleja aina kun voi.

 

JPQ
Torstaina, 4. syyskuuta, 2003 - klo 21.30:   
miksuh: c asentokin kyllä tekee minusta hieman isompaa kuin Hisoftc++ kun sillä helloworldi oli minusta noin 3100 mutta testaan kun ehdin.
mikäs idea noissa pooleissa on ?

 

miksuh
Perjantaina, 5. syyskuuta, 2003 - klo 13.37:   
JPQ: Tää voi olla hiukan sekava selittää, tää ei ole ihan helppo selittää yksinkertasestimutta yritetään. Muistipooli (Memory pool) on tietynlainen muistinhallinta systeemi. Poolit esim vähentää muistin pirstoutumista, ja pitää kirjaa varatuista muistialueista eli samalla vähentää muistivuotojen riskiä. Eli se toimii tavallaan resurssien hallintana muistinosalta.

Tavallisesti kun esim AllocMem():llä tai AllocVec():llä varataan muistia, niin käyttis antaa ohjelmalle sopivanmittasen muistinpätkän jostainpäin muistia. Varattu muistinpätkä saattaa sijaita missätahansa päin muistia, mistä nyt vaan sattu löytymään sopiva paikka. Ongelmana on se, että kun ohjelmat varailee ja vapauttelee muistialueita, niin muistiin syntyy "reikiä" eli se pirstoutuu.

Okei tähän asti suht selvää, mutta selitän nyt eka ja annan lopuks esimerkin.

Poolit pyrkii vähentään tota pirstoutumista, niin että ne järjestelee erillisiä pienempiä muistinvarauksia yhtenäisiin erillisiin kiinteänpituisiin pötköihin.

Ennen poolien käyttämistä pitää luoda sellanen. Poolin luomisen jälkeen se koostuu ns. puddleista. Puddle on siis se yhtenäinen muistipötkö, joka voi sisältää yhden tai useita erillisiä muistivarauksia.

Poolia luotaessa määritellään yksittäisen puddlen koko. Aina kun käyttis luo pooliin uuden puddlen, se on heti aluksi vähintään tuon kokonen. Poolia luotaessa määritellään myös maksimi koko yksittäiselle muistivaraukselle joka mahtuu yhteen puddleen. Jos muistivaraus on isompi, niin sille varataan kokonaan oma puddle.

Eli kuten sanoin, muistipooli siis koostuu puddleista jotka jokainen voi sisältää monta erillistä muistivarausta.

Kun sitten AllocPooled():lla varataan muistia tietystä muistipoolista, niin käyttiksen poolisysteemi varaa sen itseasiassa halutun muistipoolin siitä puddlesta missä on tilaa. Jos missään puddlessa ei ole tilaa, niin käyttis luo uuden puddlen.

Esim:

- Luodaan muistipooli, jonka puddlen koko on 2048 tavua ja suurin puddlesta varattava muistipätkä 512tavua.

- Varataan luodusta poolista Allocpooled():lla 100 tavua muistia.

Seuraus:

1) käyttis luo muistipooliin uuden puddlen, jonka koko on heti aluksi 2048 tavua, vaikka puddle on tyhjä.

2) käyttis varaa pyydetyt 100 tavua muistia puddlesta, jonka jälkeen puddlessa on tilaa 1948 tavua.

- kohta 2) voidaan toistaa, kunnes puddlesta loppuu tila. Sillon käyttis luo kohdan 1) mukaan uuden puddlen ja seuraavat muistinvaraukset tehdään siitä. jne jne.

Eli koko ton hässäkän etu on se, että tavallisesta muistinvarauksesta poiketen poolit varaa kerralla isompia pätkiä muistia, joiden sisällä voi sitten tehdä pieniä muistivarauksia ilman että tarvii hirveästi pelätä muistin pirstotutumista. Poolista voi vapaasti varata ja vapauttaa muistia ja poolisysteemi huolehtii muistivarausten ryhmittelystä mahdollisimman järkevästi.

Koska yksi puddle on yksi iso yhtenäinen varattu muistipötkö, niin yksittäiset muistivarukset puddlen sisällä ei pirsto muistia. Kun puddle vapautetaan niin sillon vapautuu yksi isompi muistipötkö, ei montaa pienempää.

Poolien etuna on myös se, että kun poolisysteemi pitää kirjaa puddleista ja muistivarauksista, niin jos koko pooli halutaan tuhota vaikka ohjelman lopussa, niin kaikki poolista tehdyt muistivaraukset vapautetaan automaattisesti. Eli vaikk jotain muistivarausta ei olis vapautettu aikasemmin, niin se vapautuu viimestään kun pooli tuhotaan. Eli ton takia poolit vähentää myös mahdollisia muistivuotoja.

Eli siis poolin voi ajatella säiliöksi, joka säilöö puddleja, puddle on vastaavasti säiliö joka pitää sisällään yksittäisiä muistivarauksia.

 

miksuh
Perjantaina, 5. syyskuuta, 2003 - klo 13.57:   
pooli jopa

 

miksuh
Perjantaina, 5. syyskuuta, 2003 - klo 14.06:   
JPQ: No siis kuten sanoin, niin startup fileitä säätämällä C-versiona sen helloworldin koko ei ole edes kiloa, eli :)

 

Jon
Perjantaina, 5. syyskuuta, 2003 - klo 14.16:   
Miksuh: voisin ehkä referoida yhtä C++-opusta ehtiessäni. Siinä kaveri ylikuormittaa new-operaattorin, siten että se napsii muistipaloja poolista. Kun objektien määrä ja koko tiedetään, niin muistinvarausta voi tehostaa helposti.

Eihän periaatteessa perus-new:llä kannata luoda tuhansia pikku kikkareita.

 

miksuh
Torstaina, 11. syyskuuta, 2003 - klo 19.46:   
Hmh asiaa tarkemmin nuuskituani näyttäs, ettei MUI:lle ole oikeen kunnon C++ wrapperia. Ehkä on parempi pysyä C:ssä sillon, kun tekee MUI ohjelmia... Aminetissa on kyllä joku MuiPlusPlus, mutta ainakin comp.sys,amiga-programming nyyssiryhmän vanhoja postauksia lukemalla näyttäs, että se on tehty jollain ikivanhalla GCC:llä joka käytti vanhan tyylisiä inlinejä. Tuo ei siis oikeen toimi uudella GCC:llä... Damn.

 

JPQ
Torstaina, 11. syyskuuta, 2003 - klo 20.54:   
miksuh: toiseksi amigan includeista minusta löytyy C++ tilassa virheitä. ainakin mun c++ kääntäjällä.:(
PS: C minusta on muutenkin kivempi kieli uskomatonta mutta totta.

 

miksuh
Perjantaina, 12. syyskuuta, 2003 - klo 12.41:   
JPQ: No C++:ssa on kuitenkin paljon kaikkea kivaa kamaa, joka tekee ohjelmoinnin helpommaksi.

Mutta ennen kaikea mä ajattelin että C++:n siirtymisestä Amigallakin olis hyötyä C++:n harjottelussa ihan koulua/työtä varten myös.

 

JPQ
Perjantaina, 12. syyskuuta, 2003 - klo 13.12:   
miksuh: minusta mitä olen katsellut oikeastaan mun kaltaiselle vaikeammaksi. terveisin outo lintu. Ja tuo koulu/työ juttu ihan järkevä. Vaikka kait jotain C:eelläkin tehdään ? (silloin kun c++ vie liikaa tilaa)

 

miksuh
Perjantaina, 12. syyskuuta, 2003 - klo 17.16:   
Joo tottakai C:lläkin tehdään paljonkin hommia vielä nykyäänkin, mutta kyllä suurinosa hommista tehdään C++:lla ja javalla. Monet jättimäiset projektit on vaan paljon helpompi hallita esim C++:lla.

 

J.
Maanantaina, 12. tammikuuta, 2004 - klo 14.11:   
JPQ: käsittääkseni C:tä käytetään vielä aika lailla sulautetussa ohjelmoinnissa. Itsekin olen töissä vääntänyt sulautettuihin järjestelmiin kohtalaisesti C-koodia. Ilmeisesti C++ ei sellaisenaan oikein sovellu sulautettuun ohjelmointiin mutta IIRC siitäkin on tulossa/tullut sulautettuun koodaukseen sopiva versio (Embedded C++).

C++ on kyllä ihan näppärä kun sen oppii hallitsemaan. Muutamat pikku STL-kokeilut StormC 4:llä antavat kyllä aika mukavan maun kunhan STL:n oppii hallitsemaan. Ja oliomenetelmällä koodaamalla voi olla huomattavasti helpompaa hallita isoja kokonaisuuksia.

Tulipa Amazonistakin tilattua pari C++ opusta. Yksi STL-opus ja yksi yleinen C++ opas. Saapa nähdä miten alkaa STL ja C++ taipua.

 

JPQ
Maanantaina, 12. tammikuuta, 2004 - klo 14.45:   
J:: mitkähän kirjat ?

 

J.
Maanantaina, 12. tammikuuta, 2004 - klo 14.57:   
JPQ: toinen oli "The C++ Standard Library: A Tutorial and Reference", toista en muista.

 

Jon
Maanantaina, 12. tammikuuta, 2004 - klo 21.34:   
Myös Meyersillä on STL-kirja. Tosin nimen perusteella tuo on vissiin ihan pätevä :)

Kirjoita J Sakuun artikkeli kirjasta, tai STL:stä, tai molemmista :)

 

J.
Torstaina, 15. tammikuuta, 2004 - klo 12.15:   
Jon: Joo, kävin tässä hakemassa nuo postista ja kyllä tuo pikaisella vilkaisulla vaikuttaa ihan pätevältä. Tosin tuo ei ole pelkkä STL-kirja vaikka ensin luulin niin. Mutta on tuossa STL-asiaakin ihan mukavasti.

Huomasinpa hassun kämmin toisessa kirjassa - sisältö on liimattu kansiin ylösalaisin ! Eli jos avaa kirjan etukannesta tulee ensimmäisenä vastaan viimeinen sivu ylösalaisin... Noh, eipä tuo suuremmin haittaa jos se muuten on kunnossa...

Pitää katsoa jos saisin kirjoitettua...

 

JPQ
Torstaina, 15. tammikuuta, 2004 - klo 13.36:   
J.: onko tuo ei pelkkä STL kirja sellainen että se opettaa standardien headeri tiedostojen funktiot ja oliot yms.

Lisää viestisi tähän
Viestisi:
Käyttäjätunnus: Postitus informaatiota:
Tämä on yksityinen keskustelupalsta. Vain rekisteröidyt käyttäjät ja moderaattorit voivat postittaa tänne.
Salasana:
valinnat: Aktivoi URL:t automaattisesti tässä viestissä
Toimenpide: