Odalokovani dat pri pousteni programu

Uživatelský avatar
Eubie
Matfyz(ák|ačka) level III
Příspěvky: 295
Registrován: 8. 10. 2005 15:35
Typ studia: Informatika Bc.
Kontaktovat uživatele:

Odalokovani dat pri pousteni programu

Příspěvek od Eubie »

Ahoj kolegové,
rád bych se zeptal, zda, pokud mi dojde paměť a já to odchytim v catchi, jestli má smysl / cenu / je to vůbec myslitelné odalokovávat dříve naalokovaná dat, naplněné kontejnery atp.
Vim, že OS to za mě udělá určitě sám, až program skončí, ale nevím, jestli to není prasečína, spolíhat se na OS. Na druhou stranu, Bednárek řikal, že nic v catchi nesmí vyvolat výjimku (neřekl ale, jestli to musí zajistit programátor nebo jestli to je nějak natvrdo zadrátovaný, že pokud něco v catchi vyvolá výjimku, tak se ututlá) a pokud by opravdu nebyla paměť, pak možná i blbý vnoření do funkce by mohlo znova problém s pamětí vytvořit (kdyby platila první možnost z předchozí závorky). Nemá někdo zkušenost, nebo názor?:)
Díky za pomoc
MrCooper
Matfyz(ák|ačka) level II
Příspěvky: 59
Registrován: 17. 1. 2006 17:54

Příspěvek od MrCooper »

Provedení kódu v catch-bloku
- Původní hodnota throw je stále uložena pro případné pokračování:
--- Příkaz throw bez výrazu pokračuje ve zpracování téže výjimky počínaje dalším catch-blokem - začíná znovu stack-unwinding
Zpracování definitivně končí opuštěním catch-bloku
- Běžným způsobem nebo příkazy return, break, continue, goto
-- Nebo vyvoláním jiné výjimky
A muj nazor?
Používat throw a catch je jednoduché
Těžší je programovat běžný kód tak, aby se choval korektně i za přítomnosti výjimek
Vyjimky resit az nakonec :) (Jestli vubec) - nejdriv potrebuju, aby to chodilo, takze vsechny chyby osetruji nejakym assertem, ktery mi pozastavi beh programu a teprve pak se staram o lepsi zpracovani (hierarchii chyb, propousteni vyse) apod. Jestli to delam blbe :shock: pak predesilam, ze nejsem zadnej hvezdnej programator :wink:
Uživatelský avatar
Eubie
Matfyz(ák|ačka) level III
Příspěvky: 295
Registrován: 8. 10. 2005 15:35
Typ studia: Informatika Bc.
Kontaktovat uživatele:

Příspěvek od Eubie »

Nojo, jenže při pushbacku do vektoru mi žádnej assert nepomůže, když mi dojde RAM:) (řekněme že máme OS na němž neni swap)
qk
Matfyz(ák|ačka) level III
Příspěvky: 181
Registrován: 24. 2. 2005 10:03
Typ studia: Informatika Mgr.
Kontaktovat uživatele:

Příspěvek od qk »

Eubie píše:Nojo, jenže při pushbacku do vektoru mi žádnej assert nepomůže, když mi dojde RAM:) (řekněme že máme OS na němž neni swap)
porad bych se ridil predchozi radou, resit to az po tom co vse ostatni pujde.
Jinak pokud nemas sanci nekde zkusit schrastit pamet (treba odstranenim zbytecnych polezek ve vectoru atd.) tak bych to nechal normalne lehnout, at si s tim system poradi....pokud delas ale knihovnu, ktera neni zivotne dulezita pro beh, musis to odalokovat, aby uzivateli mohla dal aplikace bezet a mel i nejakou pamet pro ni.
Don't worry, be dead
MrCooper
Matfyz(ák|ačka) level II
Příspěvky: 59
Registrován: 17. 1. 2006 17:54

Příspěvek od MrCooper »

2Eubie:

Uz jsi to vyresil? Pokud ne a stale ti to vrta hlavou, doporucuji nasledujici knizku:
Virius, Miroslav: Od C k C++, nakl. Kopp, České Budějovice, 2004
Sezenes ji bezne v Luxoru nebo v knihovnach.
Konkretne kapitola 6, bod 6.6.2 Vyjimky v konstruktorech a destruktorech, bod 6.6.3 Vyjimky a alokace pameti

Kdyz to nesezenes, dej mi vedet a ja ti ty dve stranky naskenuju a necham treba ve studnici vedomosti na Barbore na Male Strane.
Uživatelský avatar
Eubie
Matfyz(ák|ačka) level III
Příspěvky: 295
Registrován: 8. 10. 2005 15:35
Typ studia: Informatika Bc.
Kontaktovat uživatele:

Příspěvek od Eubie »

Díky všem za odpovědi.
Nakonec sem se zeptal i Yaghoba, jestli je to v pohodě, nechat to lehnout s naalokovanejma datama a on řikal, že pokud to spadne na nedostatku paměti, pak jo a to pokud možno nejrychleji, neboť jakýkoliv volání jakkoliv jednoduchý funkce může shodit paměť znova - jen tim, že se volání přidá na stack.
Co se výjimek týče, vyřešilo to za mě STLko, resp. jeho nepoužitelnost na aplikace vyžadující rychlost. Všechno sem si musel přepsat do C, včetně kontejnerů a nedostatek paměti se mallocem testuje skvěle, takže problém s tím, co kdy vyvolá výjimku a jak se toho zbavit, už neřeším.
I tak všem díky.
qk
Matfyz(ák|ačka) level III
Příspěvky: 181
Registrován: 24. 2. 2005 10:03
Typ studia: Informatika Mgr.
Kontaktovat uživatele:

Příspěvek od qk »

Eubie píše: Co se výjimek týče, vyřešilo to za mě STLko, resp. jeho nepoužitelnost na aplikace vyžadující rychlost.
Skoro mam pocit, ze chyba neni v STL ale nekde mezi klavesnici a zidli ;)
spravne pouzity STL je rychlejsi, nez vetsina z nas dokaze naprogramovat. Sice nektere veci mi trochu v nem chybi (napr jednosmerny spojak, ten implemtuje jen SGI STL, protoze obycejny dvojsmerny spojak ma vetsi narocnost prepojovani dvou linek). Chce to proste pouzit spravnou vec na konkretni problem.
Don't worry, be dead
Uživatelský avatar
Eubie
Matfyz(ák|ačka) level III
Příspěvky: 295
Registrován: 8. 10. 2005 15:35
Typ studia: Informatika Bc.
Kontaktovat uživatele:

Příspěvek od Eubie »

Hehehe:) Ne, promiň, ale musim ti oponovat. Pokud si správně pamatuju, Bednárek řikal, že šablony sou obecně pomalejší, než když si to někdo dobře napíše pro konrétní typ a je to logický, šablony musej bejt schopný přijmout všechny možný typy a nemůžou nijak optimalizovat svůj kód pro jednotlivý typy. Jejidh výhodou je, že pokud celá tvoje aplikace neni postavená na kontejnerech (což moje je), nemusíš se půl hodiny piplat s vlastním vektorem ale napíšeš jen jeden typedef a frčíš.
Pokud mi nevěříš, zkus si napsat aplikaci, která do mapy vloží cca 50 000 slov a ke každýmu nějakej int. Potom v tomhle hledej ty inty pro náhodný slova řekněme 100 000x. Pak si to projeď profilerem a uvidíš, kolik STOVEK milionů volání funkcí obhospodařující mapu tam budeš mít. Pak si to zkus přepsat na svůj vlastní map s hashováním místo stromu a uvidíš, jak moc se to zrychlí.
qk
Matfyz(ák|ačka) level III
Příspěvky: 181
Registrován: 24. 2. 2005 10:03
Typ studia: Informatika Mgr.
Kontaktovat uživatele:

Příspěvek od qk »

1) problem byl mezi zidly a klavesnici :) misto obycejnyho asociativniho kontejneru zkus pouzit hashovy asociativni kontejner, v tvem pripade by to tedy bylo hash_map
2) je potreba si uvedomit ze ti sablony davaji dost prostoru, navic existuji veci jako castecna specializace nebo rizeni predavani pomoci traits. Muj odhad je ze pokud nepotrebujes supr nadupanej kontejner, s kterym planujes delat opravdu velky vypocty a investovat hodne casu do jeho vyvoje, tak nema cenu delat vlastni. Muj odhad zmeny rychlosti je v radu promily az jednotek procent, coz rozdil mezi peti minutama a peti minutama a 5 sekundama neni moc velkej ;)


jinak no offense, jen nemam rad, kdyz nekdo neco tvrdi co neni zrovna odpovidaji realite, obzvlast o STL, u kteryho se mi jeste nepodarilo udelat si rychlejsi kontejner nez je jejich (u jednosmernyho spojaku mne narozdil od jejich dvojsmernyho zdrzovala horsi prace s alokaci) :wink:
Don't worry, be dead
Uživatelský avatar
Eubie
Matfyz(ák|ačka) level III
Příspěvky: 295
Registrován: 8. 10. 2005 15:35
Typ studia: Informatika Bc.
Kontaktovat uživatele:

Příspěvek od Eubie »

Aha, no vida, tak o existenci hash_mapu sem nevěděl a napsal jsem si vlastní.
Tedy argument no offense, že nemáš rád když někdo řiká něco co se nezakládá na realitě..jak jsem řikal, zkus si napsat kód, ve kterým budeš, pokud se nechceme bavit o mapě, dělat harakiki s vektorama pointerů na floatový pole. Řekněme tak 10 000 000x sem a tam, hlavně iterátory sou parádní věc. A pak si napiš za půl hoďky vlastní kontejner a srovnej výkon. A pak si popovídáme.
Já něřikám (!) že STL je špatný, špatně naprogramovaný, pro blbečky, od blbečků nebo cokoliv jinýho. Jak sem ale psal už ve svým předchozím příspěvku, každá komponenta mýho RP je právě taková, která všechny svoje výpočty dělá právě s kontejnerama. Proto je obrovskej rozdíl, jestli budu volat deset milionkrát iterátor, ++iterator atp nebot jen index do pole, integer++ atp. Pro srovnání, použitím vlastního kontejneru a optimalizací jeho alokace sem zrychlil program 120x oproti případu, kdy sem ho měl s použitím vektoru ze STL - STL ti prostě nedovolí některý věci, který si můžeš, pokud si kontejner naprogramuješ sám, dovolit. Pokud někdo nevěří, zdrojáky nejsou tajný.
Uživatelský avatar
Eubie
Matfyz(ák|ačka) level III
Příspěvky: 295
Registrován: 8. 10. 2005 15:35
Typ studia: Informatika Bc.
Kontaktovat uživatele:

Příspěvek od Eubie »

Ještě bych se rád podělil o zkušenost s stl - dávejte si pozor na to, že STL se při přechodu z Debug modu do Releasu zrychlí asi 30x, nevim, jak to, ale je to tak.
Pro rejpaly: moje řešení je stále rychlejší:)
Odpovědět

Zpět na „2005“