Automatické uvolňování paměti v c++

anonym

Automatické uvolňování paměti v c++
« kdy: 10. 01. 2017, 03:27:38 »
Co brání v C++ tomu, aby byly do kódu vloženy automaticky řádky pro uvolnění již nevyužitelných zdrojů v čase kompilace? Je to pŘece deterministický úkol, až na nějaké speciální případy je známo, kde je potřeba paměť uvolnit. Proč to teda musí programátor psát ručně?

A z jiného soudku, proč má třeba Java ještě pořád GC, když uvolňování zdrojů lze předvídat už v čase kompilace? GC přece zbytečne spotřebovává paměť a čas procesoru, tak nač?

Příklad kde to už existuje: Objective-C a Automatic References Counter.


anonym2

Re:Automatické uvolňování paměti v c++
« Odpověď #1 kdy: 10. 01. 2017, 04:46:26 »
Máte na mysli něco jako unique_ptr/shared_ptr rozšíření v C++11?

https://en.wikipedia.org/wiki/Smart_pointer

Kdo iv

Re:Automatické uvolňování paměti v c++
« Odpověď #2 kdy: 10. 01. 2017, 07:15:04 »
Co brání v C++ tomu, aby byly do kódu vloženy automaticky řádky pro uvolnění již nevyužitelných zdrojů v čase kompilace? Je to pŘece deterministický úkol, až na nějaké speciální případy je známo, kde je potřeba paměť uvolnit. Proč to teda musí programátor psát ručně?

A z jiného soudku, proč má třeba Java ještě pořád GC, když uvolňování zdrojů lze předvídat už v čase kompilace? GC přece zbytečne spotřebovává paměť a čas procesoru, tak nač?

Příklad kde to už existuje: Objective-C a Automatic References Counter.

Nekde uz tu bylo tema na GC a RC potazmo ARC, doporucuji si to nastudovat a pochopit o co jde nez budete psat tyto ne zcela spravne uvahy.

ARC neni bez rezie (muze mit horsi vliv na vykon jak GC), jedna se porad o normalni reference counting, takze je stale potreba resit smycky atd, takze tam stejne bude potreba nejakeho maleho GC, no a pokud mam byt presny tak ARC je porad forma GC ;).

Re:Automatické uvolňování paměti v c++
« Odpověď #3 kdy: 10. 01. 2017, 07:55:39 »
Jenom taková myšlenka po ránu: existence kompilátoru který obecně dokáže říct kdy se uvolňí paměť na heapu - nedá se to náhodou převést na Halting problem?

Sten

Re:Automatické uvolňování paměti v c++
« Odpověď #4 kdy: 10. 01. 2017, 08:38:26 »
Co brání v C++ tomu, aby byly do kódu vloženy automaticky řádky pro uvolnění již nevyužitelných zdrojů v čase kompilace? Je to pŘece deterministický úkol, až na nějaké speciální případy je známo, kde je potřeba paměť uvolnit. Proč to teda musí programátor psát ručně?

Ale vždyť to tam už dávno je. Jmenuje se to RAII.

A z jiného soudku, proč má třeba Java ještě pořád GC, když uvolňování zdrojů lze předvídat už v čase kompilace? GC přece zbytečne spotřebovává paměť a čas procesoru, tak nač?

Protože to lze předvídat jen někdy. I JVM umí uklidit lokální objekty bez GC.

Příklad kde to už existuje: Objective-C a Automatic References Counter.

ARC je reference counting. To se nedokáže uklidit, pokud vytvoříte cyklus.


nou

Re:Automatické uvolňování paměti v c++
« Odpověď #5 kdy: 10. 01. 2017, 09:40:53 »
Automatickemu pridanu brani "zero overhead principle" C++ ze ziadna feature nesmie brat vykon pokial ju nepouzivate. Reference counting pridava overhead takze nie je zapnuty by default.

noname

Re:Automatické uvolňování paměti v c++
« Odpověď #6 kdy: 10. 01. 2017, 13:39:52 »
ARC je reference counting. To se nedokáže uklidit, pokud vytvoříte cyklus.
Hej ale toto riesia napriklad v Swifte rozne typy referencii (weak, strong, unowned) a je to jedna z veci, na ktore treba davat pozor, kazdopadne ak si da programator pozor na cykly ARC funguje perfektne.

Kdo iv

Re:Automatické uvolňování paměti v c++
« Odpověď #7 kdy: 10. 01. 2017, 13:49:21 »
ARC je reference counting. To se nedokáže uklidit, pokud vytvoříte cyklus.
Hej ale toto riesia napriklad v Swifte rozne typy referencii (weak, strong, unowned) a je to jedna z veci, na ktore treba davat pozor, kazdopadne ak si da programator pozor na cykly ARC funguje perfektne.

No a o tom to prave je, v podstate co se spravy pameti tyce tak je treba si davat pozor, nebo mit jazyk ktery dava pozor za vas a umi vam vynadat.

anonym

Re:Automatické uvolňování paměti v c++
« Odpověď #8 kdy: 10. 01. 2017, 14:23:15 »
Ok takže pojďme předpokládat, že dát si pozor není možné. Na větším projektu nikdy nebude aplikace bez chyb. Takže jak na beton vyřešit správu paměti, nebo jak se tomu co nejvíc přiblížit, a to pomocí nějakých sw nástrujů? Dát si pozor moc nestačí.

lopata

Re:Automatické uvolňování paměti v c++
« Odpověď #9 kdy: 10. 01. 2017, 14:36:15 »
Takže jak na beton vyřešit správu paměti, nebo jak se tomu co nejvíc přiblížit, a to pomocí nějakých sw nástrujů? Dát si pozor moc nestačí.

Testovat... Valgrind toho chytí hodně, memory leaky i neuvoněnou paměť stále drženou procesem.

fe

Re:Automatické uvolňování paměti v c++
« Odpověď #10 kdy: 10. 01. 2017, 15:55:02 »

ferren

Re:Automatické uvolňování paměti v c++
« Odpověď #11 kdy: 10. 01. 2017, 16:25:39 »
osobne myslim ze se obecne automaticke nastroje pro uvolnovani pameti precenuji....a naopak, C se kvuli tomu prehnane kritizuje.
tim nerikam ze to nic neresi, ale z praxe je vetsi problem nekvalitni/nelogicky navrh, ze se zbytecne udrzuji v pameti data zbytecne, bud zbytecne dlouho, nebo prehnane dimenzovane, nevhodne strukturovane, s tim ze je to samozrejme z pohledu jazyka validni,platne tj jakoukoli automatikou neresitelne.
casteji pozoruju stovky MB takto prosustrovane a leaky ve smyslu par kB...

Ivan

Re:Automatické uvolňování paměti v c++
« Odpověď #12 kdy: 10. 01. 2017, 16:34:57 »
Automatickemu pridanu brani "zero overhead principle" C++ ze ziadna feature nesmie brat vykon pokial ju nepouzivate. Reference counting pridava overhead takze nie je zapnuty by default.

Jen dodam, ze thread-safe reference counting ma jeste vetsi overhead. A tady uz tezko muze kompilator rozhodnout jak a jestli vubec zamykat.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Automatické uvolňování paměti v c++
« Odpověď #13 kdy: 10. 01. 2017, 17:44:41 »
Automatickemu pridanu brani "zero overhead principle" C++ ze ziadna feature nesmie brat vykon pokial ju nepouzivate. Reference counting pridava overhead takze nie je zapnuty by default.

Jen dodam, ze thread-safe reference counting ma jeste vetsi overhead. A tady uz tezko muze kompilator rozhodnout jak a jestli vubec zamykat.
Ten overhead závisí na konkrétní architektuře, některé to umí hodně rychle. Navíc překladač (resp. optimizér) často pozná, že není nutné RC měnit (obdoba escape analysis).

j

Re:Automatické uvolňování paměti v c++
« Odpověď #14 kdy: 10. 01. 2017, 18:04:51 »
... Je to pŘece deterministický úkol, až na nějaké speciální případy je známo, kde je potřeba paměť uvolnit. ...

Mno ... ty bys radsi nemel zkouset ani hello world ... protoze to, jak uzasne deterministicky a primitivni to je je videt trebas v C# nebo Jave ...

Naopak, pokud nekdo chce aby aplikace fungovala s minimem zdroju, tak musi veskerou spravu zajistit prave v kodu, protoze vyhradne tvurce vi (nebo by vedet aspon mel), kde a kdy muze neco z pameti vyhodit.

A jak zminuje ferren, soudobi patlalove se spolehaj na to ze "ono se to nejak samo" a pak to vypada tak, ze i ten hello world chce 100MB RAM.