Sinoć sam nešto guglao i našao. Što se ti;emono projekta, naišao sam na njega, ali tamo piše da rezultujući fajl nije Linux executable, već .NET executable, pa program pod Linux-om treba da se pokreće komandom
mono program.exe
Ni to nije loše, ali bih više voleo pravi Linux executable izlaz. Takođe, našao sam neke tutorijale za C# na internetu, i pom onome što sam video, to bi trebalo da je pravi programski jezik za mene. Ono što bih radio se bazira na algoritmima velike složenosti u pogledu vremena i memorije koje srču. No, ubrzanje od nekoliko desetina procenata nije nešto što bi presudilo, naročito ako je budućnost okrenuta ka C#-u i C++ već izlazi iz mode. No, i dalje me muči jedno pitanje.
Ja sam razvio pokazivačke C++ šablone koji daleko unapređuju rad sa pokazivačima. Bolji su u nekom smislu i od ugrađenih pokazivačkih šablona. Naime, imam šablon PC<tip> koji glumi pokayiva; na objekte tipa tip. Primerak te šablonske klase se automatski inicijalizuje na nulu. Kada se pokuša pristup adresi na koju ukazuje takav nulti pokazivač, automatski se rezerviše prostor za objekat tipa tip i rukuje se sa odgovarajućom adresom. Na primer:
PC<double> p;
*p = 73.8;
Korišćenje new i delete operatora za ove pokazivače niti je dozvoljeno niti je potrebno. Destruktor će automatski uništiti odgovarajuću dinamičku promenljivu. No, to imaju i ugrađene pokazivačke klase. Ova šablonska klasa takođe ima brojač referenci.
Evo gde sam ja odstupio. Kada se porede dva pokazivača tipa PC<T>, gde je T bilo koji tip (klasa) operatorom ==, zapravo se porede sadržaji na koje oni ukazuju. Tako, ako napravimo listu pomoću ovakvih pokazivača, za liste l1 i l2 će vrednost izraza l1==l2 biti true akko je reč o jednakim listama na moguće različitim mestima u memoriji. Slično važi i za operator !=. Operator dodele će iskopirati sadržaj (odnosno strukturu) itd. Za poređenje adresa na koje pokazivači pokazuju se koristi metod same().
Sve ovo lepo radi kada nemamo strukture sa ciklusima, a onda se ulazi u beskonačnu petlju pri kopiranju, dodeli, poređenju. No, tada se koristi makro klasa GPC(tip) koja rešava i taj problem. Naizgled, svi problemi su rešeni. Međutim...
Da bi računar na primer iskopirao takvu listu, na ovakav način primenjuje rekurzivan algoritam bilo da je u pitanju klasa PC (Pointer Class) ili GPC (General Pointer Class), pri čemu GPC ima nešto sporije algoritme. No, sve to opterećuje stek, što znači da pri radu sa iole veći strukturama može doći do "pucanja" steka. Drugim rečima, ne koristi se raspoloživa memorija računara, već samo jedan njen deo - onaj koji je rezervisan za stek.
Sve to ne bi bilo tako loše kada bi C++ kompajler malo optimalnije koristio stek, odnosno čistio stek destruktora kada više nije potrebno koristiti niti jednu njegovu lokalnu promenljivu (metod hvatanja za rep). E, zanima me šta se na računaru sa 512 MB RAM-a dešava kada se u jeziku C# na opisani način napravi lista od 10 miliona članova.
Hvala svima
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.