C++, použití free()

JSH

Re:C++, použití free()
« Odpověď #15 kdy: 05. 09. 2013, 09:41:37 »
Můžu mít nesmělý polozačátečický dotaz?  ;)
Proč, když už se jedná o C++ používat malloc() a free(), když lze využít přehlednější operátory new a delete? Je zde nějaký rozdíl v imlementaci, či výkonu nebo se je nepodstatné který způsob alokování paměti využiji?
Díky za odpověď.
Nemám pocit, že by new a delete byly nějak výrazně přehlednější. Třeba pro alokaci pole čísel se dá použít oboje. new a delete jsou potřeba, když ty alokované objekty mají netriviální konstruktory a destruktory. new/delete zase nemají nic podobného realloc(). Ale realloc() se používá hodně špatně ve chvíli, když můžou lítat výjimky. Inteligentní ukazatele taky implicitně volají delete. Použít u nich malloc znamená trochu víc psaní.

Trocha čiré spekulace :
malloc se používá v C, kde je zvykem hodně konzervativní práce s pamětí. Takže bych čekal že new by se mohl chovat trochu líp při alokaci spousty malých objektů. Ale tohle se bude lišit mezi překladači a mezi prostředími. Obecně neexistuje alokátor paměti vhodný pro všechno, takže to chce měřit.

Když to shrnu :
Většinou bych v C++ používal new. malloc se může hodit ve speciálních případech (je potřeba realloc, budu stejný kód překládat i C překladačem, v mém překladači je new zabugovaný nebo používá nevhodný alokátor pro mé účely, ...)

A kdyby si chtěl někdo zaflamovat :
Osobně nemám new/delete moc rád. Mít klíčová slova pro alokaci paměti je myslím zbytečné. Stačila by nějaká možnost zavolat konstruktory nad prázdnou pamětí a vlastní alokaci nechat knihovním funkcím. new/delete jdou sice přetížit, ale je to nepřehledné a komplikované. Raději vytvářím objekty pomocí nějaké vlastní funkce.


Kolemjdoucí

Re:C++, použití free()
« Odpověď #16 kdy: 05. 09. 2013, 09:50:47 »
Osobně nemám new/delete moc rád. Mít klíčová slova pro alokaci paměti je myslím zbytečné. Stačila by nějaká možnost zavolat konstruktory nad prázdnou pamětí a vlastní alokaci nechat knihovním funkcím. new/delete jdou sice přetížit, ale je to nepřehledné a komplikované. Raději vytvářím objekty pomocí nějaké vlastní funkce.

new a delete existuje především kvůli volání konstruktorů a destruktorů.
Konstruktor a destruktor si můžeš zavolat i bez práce s pamětí tak jako normální funkci, stačí si přečíst příslušnou dokumentaci.
Není problém alokovat 10 MB pomocí jednoho malloc a pak zavolat milion konstruktorů již bez alokace paměti.

prezek

  • ***
  • 229
    • Zobrazit profil
Re:C++, použití free()
« Odpověď #17 kdy: 05. 09. 2013, 09:59:31 »
boost::multi_array
http://www.boost.org/doc/libs/1_54_0/libs/multi_array/doc/user.html
A to jako vážně? Místo 6 řádků snad každému srozumitelného programu stahovat nějakou knihovnu s 373 MB? Ještě že neumím pořádně programovat, protože tohle není nic pro mě.

gamer

Re:C++, použití free()
« Odpověď #18 kdy: 05. 09. 2013, 10:07:10 »
apt-get install libboost-all-dev
Hotovo. boost je standardní široce používaná knihovna a hodně věcí z boostu se dostalo do C++11. Skoro všechno v boostu je v šablonách, takže nemusíš přilinkovat žádnou statickou libku, stačí includovat headery. Že to nepoužíváš a znovuvynálézáš kolo je tvoje rozhodnutí ;).

JSH

Re:C++, použití free()
« Odpověď #19 kdy: 05. 09. 2013, 10:15:45 »
A to jako vážně? Místo 6 řádků snad každému srozumitelného programu stahovat nějakou knihovnu s 373 MB?
Ano, vážně.

Těch 6 řádků stačilo jen na alokaci a uvolnění. Jak se s tím začne něco netriviálního dělat, tak začnou řádky bobtnat. O tom, že je těch 6 řádků srozumitelných, by se dalo pochybovat. Koukni se na ně a řekni mi jestli tam někde nechybí hvězdička. Schválně, jak dlouho ti to vezme.

Boost je velká knihovna, která obsahuje spoustu užitečných věcí. Nejen relativně malou multi_array. Nevím, kde jsi sebral 300 mega. Aktuální verze má třetinu (zip) a to je včetně dokumentace a hodně rozsáhlých testů.

Psát věci, na které se dají použít knihovny, znova a znova nepovažuju za rozumné využití času. Ano, znamená to si tu knihovnu stáhnout a přečíst si manuál. Ale pak můžeš psát kratší, jednodušší, čitelnější a spolehlivější kód.

Ještě že neumím pořádně programovat, protože tohle není nic pro mě.
Jeden ze znaků dobrého programátora je, že zbytečně znovu nevynalézá kolo.


JSH

Re:C++, použití free()
« Odpověď #20 kdy: 05. 09. 2013, 10:22:30 »
Konstruktor a destruktor si můžeš zavolat i bez práce s pamětí tak jako normální funkci, stačí si přečíst příslušnou dokumentaci.
To samozřejmě umím. Co jsem chtěl říc bylo, že imho nemuseli do C++ přidávat celou tu obludnou mlátičku. Stačila by právě jen nějaká varianta placement new bez vlastní alokace a všeho toho přetěžování. Ale to jsou jen takové zbytečné řeči :)

Waseihou

Re:C++, použití free()
« Odpověď #21 kdy: 05. 09. 2013, 13:16:58 »
Jednou se mi stalo že jsem v jednom programu mixoval new/delete a malloc/free při alokaci paměti a pak mi program náhodně padal při vykreslování bitmap do paměti. Ze zkušenosti proto mohu doporučit v C++ používat pouze new/delete, zvláště pokud vás okolnosti nutí kódovat něco pod widlemi...

j

Re:C++, použití free()
« Odpověď #22 kdy: 05. 09. 2013, 14:06:26 »
apt-get install libboost-all-dev
Hotovo. boost je standardní široce používaná knihovna a hodně věcí z boostu se dostalo do C++11. Skoro všechno v boostu je v šablonách, takže nemusíš přilinkovat žádnou statickou libku, stačí includovat headery. Že to nepoužíváš a znovuvynálézáš kolo je tvoje rozhodnutí ;).

Ehm ... a ty potrebujes prehazet pytlik pisku a objednal sis na to velkorypadlo. Normalni clovek nepouziva knihovny z nihz nevyuzije aspon 10% funcionality.

Re:C++, použití free()
« Odpověď #23 kdy: 05. 09. 2013, 14:38:23 »
Ehm ... a ty potrebujes prehazet pytlik pisku a objednal sis na to velkorypadlo. Normalni clovek nepouziva knihovny z nihz nevyuzije aspon 10% funcionality.

Asi bych se držel toho, co o sobě tvrdí Boost, a sice že je to "Boost C++ Libraries", tedy je to balík knihoven nikoliv knihovna. Takže je zcela normální, že člověk nevyužije většinu funkcionality.

gamer

Re:C++, použití free()
« Odpověď #24 kdy: 05. 09. 2013, 14:39:33 »
Ehm ... a ty potrebujes prehazet pytlik pisku a objednal sis na to velkorypadlo. Normalni clovek nepouziva knihovny z nihz nevyuzije aspon 10% funcionality.

Znovu opakuji: BOOST SE NEKOMPILUJE!!! Je to celé v šablonách, ve výsledné binárce bude přilinkované jen to, co skutečně použiješ. Mimochodem kdybys použil 10% toho co je v boostu, můžeš se považovat za senior expert guru programátora ;)

prezek

  • ***
  • 229
    • Zobrazit profil
Re:C++, použití free()
« Odpověď #25 kdy: 05. 09. 2013, 16:21:00 »
A co když zvládnu v jednom programu využít 11,7845%? To mě rovnou přijede pogratulovat ředitel NASA a nabídne mi práci? Není to náhodou spíše tak, že každý projekt je unikátní a u některých složitějších se vyplatí používat knihovny? A u některých jednoduchých s omezenou pamětí, výpočetním výkonem apod se vyplatí používat ***, vlastní definici funkce sinus, vlastni printf...? Zatím jste mě nepřesvědčili, že double *** p; je něco, za co by se měl jeho autor popravit, nebo minimálně chodit kanálama. Často se setkávám s tím, že bojuju o každý bajt programu, abych se vešel i s bootloaderem do 8 kB. Při použití multi_array je velikost programu 88kB, s *** má 40 kB. S multi_array jel testovací program 28s a s *** byl za 5s hotov. Co je úspornější z hlediska RAM jsem nezkoušel, ale odhaduju, že to bude s multi_array zase horší.

Kolemjdoucí

Re:C++, použití free()
« Odpověď #26 kdy: 05. 09. 2013, 16:53:52 »
BOOST SE NEKOMPILUJE!!! Je to celé v šablonách

Nutnou podmínkou použití šablon je jejich kompilace a to ještě se to kompiluje znovu v každém *.cpp kde je to použito. Proto to taky tak dlouho trvá, naštěstí máme rychlé počítače.


Přepsal bych *** na několik typedefů Level1, Level2, Level3. Rychlost stejná, orientace v kódu mnohem lepší.

Ivan

Re:C++, použití free()
« Odpověď #27 kdy: 05. 09. 2013, 17:09:09 »
Ehm ... a ty potrebujes prehazet pytlik pisku a objednal sis na to velkorypadlo. Normalni clovek nepouziva knihovny z nihz nevyuzije aspon 10% funcionality.

Ja to tak delam. Napr: nez abych se sr*l s tim ja porovnat dva STL stringy case-insensitive, tak radsi pouziju boost. Boost (popr. Loki) obsahuji spoustu zajimavych komponent, ktery bych nikdy sam nevymyslel. Vymyslenim kola bych akorat zabil spoustu casu, ktery muzu venovat i jinym vecem.

PS: V pripade Java, PHP, Pythonu, Perlu, .. je uplne normalni ze clovek nevyuzije vic jak 10% standartni knihovny. To je specifikum C++ ze jeho standartni knihovna dohromady nic moc neumi.


libcha

Re:C++, použití free()
« Odpověď #28 kdy: 05. 09. 2013, 18:21:33 »
Hlavně se ohánět efektivitou. Pár pointerů navíc, čert je vem, pokud ti nejde o "každý bajt". Horší je ten milión dereferencí, když máš plnej procesor násobiček, který leží ladem.
Kód: [Vybrat]
#define pole(x, y, z) __pole[x*ix*iy+y*iy+z]
__pole = malloc(ix*iy*iz*sizeof(double));
...
free(__pole);
Bez boostu, přehledně, rychle a jednoduše ;)
(Nemaťte mě za chybějící závorky v makru, vynechal jem pro přehlednost.)

j

Re:C++, použití free()
« Odpověď #29 kdy: 05. 09. 2013, 18:41:26 »
...

Tak to je jasny, to kvuli tobe ma pak "hello world" 50MB ...

Mimochodem, srovnavas nesrovnatelny, java, php ... nejsou kompilovany jazyky. Zlaty lidi, co jeste dneska umej delat 64kB demace ...