abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 04:55 | Zajímavý software

    Microsoft zveřejnil na GitHubu zdrojové kódy MS-DOSu 4.0 pod licencí MIT. Ve stejném repozitáři se nacházejí i před lety zveřejněné zdrojové k kódy MS-DOSu 1.25 a 2.0.

    Ladislav Hagara | Komentářů: 0
    včera 17:33 | Nová verze

    Canonical vydal (email, blog, YouTube) Ubuntu 24.04 LTS Noble Numbat. Přehled novinek v poznámkách k vydání a také příspěvcích na blogu: novinky v desktopu a novinky v bezpečnosti. Vydány byly také oficiální deriváty Edubuntu, Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu Cinnamon, Ubuntu Kylin, Ubuntu MATE, Ubuntu Studio, Ubuntu Unity a Xubuntu. Jedná se o 10. LTS verzi.

    Ladislav Hagara | Komentářů: 7
    včera 14:22 | Komunita

    Na YouTube je k dispozici videozáznam z včerejšího Czech Open Source Policy Forum 2024.

    Ladislav Hagara | Komentářů: 1
    včera 13:22 | Nová verze

    Fossil (Wikipedie) byl vydán ve verzi 2.24. Jedná se o distribuovaný systém správy verzí propojený se správou chyb, wiki stránek a blogů s integrovaným webovým rozhraním. Vše běží z jednoho jediného spustitelného souboru a uloženo je v SQLite databázi.

    Ladislav Hagara | Komentářů: 0
    včera 12:44 | Nová verze

    Byla vydána nová stabilní verze 6.7 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 124. Přehled novinek i s náhledy v příspěvku na blogu. Vypíchnout lze Spořič paměti (Memory Saver) automaticky hibernující karty, které nebyly nějakou dobu používány nebo vylepšené Odběry (Feed Reader).

    Ladislav Hagara | Komentářů: 0
    včera 04:55 | Nová verze

    OpenJS Foundation, oficiální projekt konsorcia Linux Foundation, oznámila vydání verze 22 otevřeného multiplatformního prostředí pro vývoj a běh síťových aplikací napsaných v JavaScriptu Node.js (Wikipedie). V říjnu se verze 22 stane novou aktivní LTS verzí. Podpora je plánována do dubna 2027.

    Ladislav Hagara | Komentářů: 0
    včera 04:22 | Nová verze

    Byla vydána verze 8.2 open source virtualizační platformy Proxmox VE (Proxmox Virtual Environment, Wikipedie) založené na Debianu. Přehled novinek v poznámkách k vydání a v informačním videu. Zdůrazněn je průvodce migrací hostů z VMware ESXi do Proxmoxu.

    Ladislav Hagara | Komentářů: 0
    včera 04:11 | Nová verze

    R (Wikipedie), programovací jazyk a prostředí určené pro statistickou analýzu dat a jejich grafické zobrazení, bylo vydáno ve verzi 4.4.0. Její kódové jméno je Puppy Cup.

    Ladislav Hagara | Komentářů: 0
    24.4. 22:44 | IT novinky

    IBM kupuje společnost HashiCorp (Terraform, Packer, Vault, Boundary, Consul, Nomad, Waypoint, Vagrant, …) za 6,4 miliardy dolarů, tj. 35 dolarů za akcii.

    Ladislav Hagara | Komentářů: 12
    24.4. 15:55 | Nová verze

    Byl vydán TrueNAS SCALE 24.04 “Dragonfish”. Přehled novinek této open source storage platformy postavené na Debianu v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    KDE Plasma 6
     (73%)
     (9%)
     (2%)
     (16%)
    Celkem 769 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Tint3 v C++

    Nová větev vývoje lehkého panelu Tint2 (a Tint2-svn s launcherem) používá C++, od čehož si vývojáři slibují lepší stabilitu a odolnost proti chybám. Tint3 se tak může stát vedle jiných lehkých panelů zajímavou alternativou. Launcher však doposud nepodporuje.

    10.2.2015 11:57 | Petr Ježek | Nová verze


    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    10.2.2015 13:26 koudy
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Nevím, podle mého je důležitější kdo a jak programuje, ne v čem.

    Navíc bych nepovažoval C++ za zrovna bezpečný a blbu-vzdorného.

    Minimálně bych se poohlížel po něčem co má garbage collector.
    David Šmíd avatar 10.2.2015 14:00 David Šmíd | skóre: 10 | blog: dsmid
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Na co bys v jazyku s RAII idiomem potřeboval garbage collector ?

     


    Jediné "intuitivní" rozhraní je bradavka. Všechno ostatní se musíte naučit. -- Bruce Ediger, o uživatelském rozhraní
    kozzi avatar 10.2.2015 14:36 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
    Rozbalit Rozbalit vše Re: Tint3 v C++

    napriklad prave ta bezpecnost se lepe resi v jazycich s GC. Kazdopadne ja bych to radeji nez v C++ psal v D, ktere mi IMHO prijde na psani bezpecneho kodu o neco lepe vybavene a nebo rust

    Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
    Rezza avatar 10.2.2015 14:45 Rezza | skóre: 25 | blog: rezza | Brno
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Problem je, ze proste exoticky jazyk = mensi sance na rozsireni. C/C++/Python/Perl je asi vsude, vsechno ostatni uz je tak nejak bokem. Staci si jen vzit, jak vrasky ted distribucim dela Go. Takze ano, nejaky z dnesnich cool jazyku muze byt na tento typ ukolu lepsi, ale zrejme zvitezil pragmatismus ve forme, ze to pak lidi budou chtit pouzivat na ruznych distrech.
    10.2.2015 14:54 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Staci si jen vzit, jak vrasky ted distribucim dela Go.
    To je imho spíš tím, že má přiblblej build systém + package management než tím, že to je cool nový jazyk...
    Rezza avatar 10.2.2015 15:28 Rezza | skóre: 25 | blog: rezza | Brno
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Trebas pruser c. 1 je, ze aktualne je jen x86_64 only... Lidi samozrejme chteji Docker vsude. I kdyz i to se zlepsuje.
    10.2.2015 15:41 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Trebas pruser c. 1 je, ze aktualne je jen x86_64 only...
    Cože?
    Rezza avatar 10.2.2015 17:20 Rezza | skóre: 25 | blog: rezza | Brno
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Tak sorry, Intel. To x86_64 jsem asi jen nekde blbe zaslechl. Uz je i podpora Armu a co vim, tak se dela na Poweru.
    10.2.2015 20:29 Foo Bar | skóre: 14
    Rozbalit Rozbalit vše Re: Tint3 v C++
    > Staci si jen vzit, jak vrasky ted distribucim dela Go.

    Navíc, když upstream na distribuce úplně peče (pekl)... tak jsem to vzdal a v Debianu to teď dělá někdo jiný.
    David Šmíd avatar 10.2.2015 14:54 David Šmíd | skóre: 10 | blog: dsmid
    Rozbalit Rozbalit vše Re: Tint3 v C++

    Cool jazyk je bez knihoven k ničemu.

    C++ je pro psaní bezpečného kódu také velmi dobře vybaven, stačí nezneužívat jím poskytovanou volnost a programovat jako člověk, ne jako prase.

     


    Jediné "intuitivní" rozhraní je bradavka. Všechno ostatní se musíte naučit. -- Bruce Ediger, o uživatelském rozhraní
    10.2.2015 14:55 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Tint3 v C++
    napriklad prave ta bezpecnost se lepe resi v jazycich s GC.
    Už jsem viděl příliš mnoho NullPointerException, race conditions, korupcí dat a podobně než abych nečemu takovému byl ochoten věřit...
    kozzi avatar 10.2.2015 23:04 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
    Rozbalit Rozbalit vše Re: Tint3 v C++

    NullPointerException a race conditions s tim nijak nesouvisi, ta korupce dat to je prave to cemu se snazi nektere jazyky dnes zabranit, samozrejme pokud vezmu v uvahu systemovy jazyk jako je D, tak ten ti samozrejme musi umoznit korupci dat :), ale to neznamena ze nema nastroje a moznosti jak se predtim chranit.

    Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
    xkucf03 avatar 10.2.2015 23:20 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Tint3 v C++

    Tohle jsou problémy, které s GC nesouvisí – GC ti je nezpůsobí, způsobuješ si je sám i kdybys ho neměl, GC ti akorát řeší některé problémy, které bys bez něj musel ošetřovat ručně (což znamená riziko dalších chyb). A RAII taky není úplně marný přístup, to musím uznat i jako Javista :-)

    Za dobrou (bezpečnou) volbu považuji silně typovaný jazyk s GC nebo s RAII + nepoužívat nízkoúrovňové konstrukce (surové ukazatele, předčasná optimalizace atd.). Co se týče vícevláknového/víceprocesorového programování, je lepší použít nějaký framework/knihovnu, než spoléhat na magické schopnosti některých jazyků – některé věci prostě nejde automatizovat, nemůže to fungovat „samo“ – resp. může, ale blbě – a je potřeba mít možnost to ovlivnit (tzn. více či méně nepřímo s těmi vlákny je třeba pracovat).

    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    10.2.2015 23:25 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Tohle jsou problémy, které s GC nesouvisí
    No právě ;-)
    xkucf03 avatar 10.2.2015 23:59 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Tint3 v C++

    Což ale nezpochybňuje pozitivní vliv GC (nebo striktního využívání RAII) na bezpečnost.

    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    10.2.2015 17:33 Jardík
    Rozbalit Rozbalit vše Re: Tint3 v C++
    To jsem si takhle jednou dělal parametrický crc (různý počet bitů, atd). Jednou v C++ a jednou v D. V obou případech jsem použil šablony. C++ ve výkonosti vyhrálo na plné čáře (žádné alokace, pouze na začátku, zbytek byl pořád nad stejným vzorkem dat, taky jsem používal final u D, aby tam nebyly virtuální fce). Dokonce jsem to pak udělal ještě v Javě, použitím dědičnosti, virtuálních fcí, atd ... dokonce i v Javě to bylo rychlejší než v D. Nemohl jsem tomu uvěřit. No a pak jsem zahodil dmd a vyzkoušel to zkompilovat s LDC .. a bylo to alespoň srovnatelné s tou Javou. C++ bylo však stále skoro dvojnásobně rychlejší.
    kozzi avatar 10.2.2015 22:59 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
    Rozbalit Rozbalit vše Re: Tint3 v C++

    asi si to mel spatne napsane :D. Jinak vetsina meho kodu je v D stejne rychla a nekdy i rychlejsi nez v C++, ale samozrejme to casto je tim ze to v C++ neumim napsat tak dobre. Jinak by melo platit ze v D se da napsat stejne rychly kod jak v C++ za pouziti stejneho backendu, takze misto ldc nejspis gdc, teda pokud si to c++ nekompiloval clang kompilatorem to by pak to ldc bylo spravnejsi volbou.

     

    A nemas ten kod nekde nahodou jeste? Jen ze bych zkusil zjistit co je na nem spatne, pripadne kde je problem v D ze to je pomale.

    Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
    10.2.2015 23:00 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Tint3 v C++

    Asi tak, kdyby valná většina programátorů to dělala pro uživatele a ne pro pohodu, tak by nám stačilo pár mega na desktop a na většinu aplikací a šlahalo by to jak z praku. Ale komukoliv žel kdekdo si hraje s jakýmisi skriptovacími jazyky či pseudokódem protože je to jednoduché a kúúl a potřebujeme 10× až 100× víc paměti a procesor s výkonem jak kráva. ;-)

    Jsem si říkal jestli nejsu pako, když jsem předělával Pascal (třeba i Delphi) do C++ (třeba C++Builder-u) kvůli výkonu a na něco použil čisté C, a ty rozdíly byli docela zanedbatelné oproti tomu, když to někdo pak udělá v těch dalších pseudokód či skriptovacích jazycích. ;-)

    ¡Kjucííí přestaňte skriptovat a začněte programovat!

    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    kozzi avatar 10.2.2015 23:07 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
    Rozbalit Rozbalit vše Re: Tint3 v C++

    Eh D neni skriptovaci jazyk a jeho vykonnost je srovnatelna s C a C++ a pametova narocnost je(muze byt) velmi mala. Duvodem proc to dneska zere vic je casto spis i to ze lidi na optimalizaci kaslou nehlede na tom v cem to je napsane.

    Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
    11.2.2015 12:37 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Tint3 v C++
    To byl takový výkřik a spíš v tom příspěvků „útok“ na Javu, i ten Python nebo jiné lze zkompilovat a pustit normálně. Rozdíl je v tom kašlat na optimalizaci v C (alokuji nanejvýš větší pole než potřebuji) nebo v C++, kde to spíš má dopad na výkon (kašlu na připravení zásobníku na dostatečnou velikost a dochází k více alokacím) oproti jiným „scriptovacím či pseudo-binárním“, kde už jen netypické použití, vyvolá paměťové superalokace a u výkonu nikdy nevíš…
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    10.2.2015 15:02 koudy
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Třeba na dynamické alokování něčeho proměnného? (texty, raw data, I/O buffery - všechno z toho jde určitě udělat staticky, ale dynamicky to může být OBČAS jednodušší/čistší/...)

    Destructor sice zabrání memory leaku, ale s alokací/vytvářením je to horší.

    Rád se nechám poučit, C++ jsem už dlouho neviděl ani z rychlíku. ;)
    10.2.2015 15:22 adgadg
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Uz len to ze si odporucil jazyk, ktory nema ani stable build na nieco "seriozne" s tym, ze to bude lepsia volba je WTF ;)
    10.2.2015 15:45 koudy
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Coto? Kde doporučuji jakýkoliv jazyk?

    Jediné co jsem psal, že s GC se pracuje lépe, protože nemusíte spoustu věcí řešit.
    11.2.2015 11:55 ajiadf
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Ooops sorry ..koudy a kozzi sa mi poplietli :D
    11.2.2015 12:54 koudy
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Takhle hlavně že se Vám nepletou jiné kozy ;)
    11.2.2015 12:58 koudy
    Rozbalit Rozbalit vše Re: Tint3 v C++
    "Takhle" mělo být "Tak"...

    Ach jo měl bych si to nejdřív přečíst, než to pošlu :)
    David Šmíd avatar 10.2.2015 15:50 David Šmíd | skóre: 10 | blog: dsmid
    Rozbalit Rozbalit vše Re: Tint3 v C++

    Dynamické alokování tě v C++ jako uživatele knihovny vůbec nemusí zajímat.

    Každé použití operátoru new v programu obvykle svědčí o špatném návrhu aplikace (o malloc ani nemluvě).

    Uživatel knihovny prostě jen použije objekt, jehož implementace není jeho starost:

    {
      IOBuffer<char> myBuffer;
      ...
    } // myBuffer zaniká
    
    Pokud bude chtít autor IOBufferu ukládat data na heapu, může nadefinovat třeba tenhle atribut:
    unique_ptr<deque<T>> data{new deque<T>};

    Žádný destruktor není pro uvolňování paměti potřeba, o vše se postará unique_ptr a RAII.

    Doporučuji k přečtení knihu A Tour of C++ od Stroustrupa.

     


    Jediné "intuitivní" rozhraní je bradavka. Všechno ostatní se musíte naučit. -- Bruce Ediger, o uživatelském rozhraní
    10.2.2015 16:48 ava
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Samotného by mě zajímalo, jak v C++ na věci, které v jazycích s GC nemusíš řešit.

    1) jestli se nepletu, unique_ptr je v C++ oficiálně až od r. 2011. Znamená to, že do té doby se nedala pamět správně managovat? Nebo měl každý svoje ad-hoc řešení (někdo použil jednu knihovnu, druhý jinou, třetí si to napsal sám, čtvrtý to nechal leakovat)?

    2) Jak v C++ čistě řešit následující situaci? Jde o interakci s uživatelem, získám polymorfní Shape, a v závislost na tom, co uživatel chce, s ní asynchronně (v samostatných vláknech) provedu 0 .. n operací.

    pseudokód:
    {
     Shape *shape = getShapeFromUser();
    
     if (userWantsAPrintout()) {
        asyncPrint(shape);
     }
    
     if (userWantsToSeeTheShapeInAViewer()) {
        asyncView(shape);
     }
    }
    
    
    
    10.2.2015 17:13 Ivan
    Rozbalit Rozbalit vše Re: Tint3 v C++
    - pred 2011 tu byl auto_ptr, ktery fungoval podobne jako unique_ptr, az na to ze se nedal rozumne ulozit do kontejneru. Coz byl od oser.

    - pokud o tu druhou otazku, tak to C++ vubec neresi. Bud pouzijes nejaky framework (treba QT) a ten to udela za tebe
     if (userWantsAPrintout()) {
        emit asyncPrint(shape);
     }
    
    anebo si to napises sam, s tim ze ten shape vloziz do fronty a nejaky bg thread si to vyzvedne.

    To "novy" C++ nespadlo z nebe, ale znacna jeho cast uz byla implementovana v knihovne boost. A ten kdo pouzival boost, tak ten se pak nedivil.

    10.2.2015 17:40 ava
    Rozbalit Rozbalit vše Re: Tint3 v C++
    K té druhé otázce mě hlavně zajímalo, jak managovat pamět, ne, jak spustit operaci asynchronně. Víc v mé reakci na kralyka.

    K tomu závěru: A ten, kdo nepoužíval boost, ale třeba poco, nebo QT, ten se taky nedivil, ale jinak...
    10.2.2015 17:26 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Znamená to, že do té doby se nedala pamět správně managovat? Nebo měl každý svoje ad-hoc řešení (někdo použil jednu knihovnu, druhý jinou, třetí si to napsal sám, čtvrtý to nechal leakovat)?
    Asi tak, nicméně unique_ptr je fakt jednoduchej, "knihovna" je silný slovo, je to na pár řádek v header file. Jinak tuším, že unique_ptr byl taky v TR 03.

    A shared_ptr není až tak o moc složitější, pokud máš k dispozici atomické integery.
    Jak v C++ čistě řešit následující situaci?
    Např. pomocí toho shared_ptr.
    10.2.2015 17:38 ava
    Rozbalit Rozbalit vše Re: Tint3 v C++
    1) Teď jsi mi dost srazil sebevědomí. https://gcc.gnu.org/onlinedocs/gcc-4.6.2/libstdc++/api/a01099_source.html mi nepřijde "fakt jednoduchý" :(

    2) Znamená to, že getShapeFromUser() nemá vracet unique_ptr, ale shared_ptr? Tj. autor té funkce musí předvídat, že shape se bude používat asynchronně? Nebo je to jinak?
    David Šmíd avatar 10.2.2015 18:56 David Šmíd | skóre: 10 | blog: dsmid
    Rozbalit Rozbalit vše Re: Tint3 v C++
    unique_ptr se nikdy nevrací, pokud existuje sebemenší možnost, že se bude pointer někam předávat, použije se shared_ptr.

     


    Jediné "intuitivní" rozhraní je bradavka. Všechno ostatní se musíte naučit. -- Bruce Ediger, o uživatelském rozhraní
    10.2.2015 20:25 Jindřich Makovička | skóre: 17
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Naopak, například z Factory je vhodné vracet unique_ptr, neboť ten se automaticky převede na shared, pokud je potřeba.
    10.2.2015 18:57 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Tint3 v C++
    1) Teď jsi mi dost srazil sebevědomí. https://gcc.gnu.org/onlinedocs/gcc-4.6.2/libstdc++/api/a01099_source.html mi nepřijde "fakt jednoduchý" :(
    Tam jsou fíčury, který nutně nejsou potřeba a navíc to je gnuobfuskované :-D Dá se to napsat jednodušeji.
    2) Znamená to, že getShapeFromUser() nemá vracet unique_ptr, ale shared_ptr? Tj. autor té funkce musí předvídat, že shape se bude používat asynchronně? Nebo je to jinak?
    To záleží na širším kontextu, těch možností je vícero. Pokud ti odněkud přijde raw pointer, můžeš si ho do shared_ptr zabalit dodatečně, pokud to dává smysl v dané situaci.

    K tomu tvému kódu: Přijde mi to jako javismus (objekty se posílají kdykoli kdekoli, přístup se neřídí, není posílání objekty hodnotou,...). Ty dvě async funkce vypadají jako read-only operace, takže by bylo dost možná nejlepší vrátit z té funkce konstatní referenci, za předpokladu, že doba životnosti toho Shape je někde vhodně spravována. Případně pokud je Shape možné bez větších problémů kopírovat, mohlo by být lepší vracet ho hodnotou, ne poiterem. Některé frameworky (třeba zmíněný Qt) používají na podobné věci COW wrappery. Zkrátka opravdu to záleží na nějakém celkovém návrhu, protože takhle to je pouze kousek kódu vytržený z nějakého neznámého návrhu a pak nelze jednoznačně říct, jak by vypadal ekvivalent v C++.
    10.2.2015 19:31 ava
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Díky za odpovědi.

    @kralyk

    No, asi je to Javismus v tom smyslu, že prostě v těle té funkce getShapeFromUser nechci být nucen přemýšlet o tom, jak bude výsledek používán. Single responsibility principle - getShapeFromUser se má starat o získání shape od uživatele, a nic víc. To považuji za základ composable softwaru - jednotlivé komponenty mohu psát odděleně, a to, jak si je potom sestavím, záleží až na konkrétní situaci.

    @kralyk, @ivan

    Jaký je v této situaci nejvhodnější návratový typ (pointeru)? Předpokládejme, že Shape je immutable. shared_ptr? Znamená to, že vždy, když nemám absolutní jistotu, jak bude výsledek funkce vypadat, měl bych vracet shared_ptr, jak píše David Šmíd? Nebo unique_ptr, a v případě potřeby překonvertit na shared_ptr? Může nastat potřeba shared_ptr, pokud nedochází ke sdílení objektu mezi vlákny?

    Další věc (neznám přesně C++ syntaxi, myšlenka snad bude správně):
    {
     shared_ptr<Shape> shape = getShapeFromUser();
    
     if (userWantsAPrintout()) {
        asyncPrint(shape);
     }
    
     ... další, nesmírnědlouhotrvající práce
    }
    
    Pokud v tomto případě asyncPrint skončí rychle, během nesmírnědlouhotrvající práce bude shared_ptr na shape pořád alokovaný, je to tak? Rozumím tomu správně, že abych ho uvolnil včas, musel bych ho explicitně dekrementnout (je správná moje doměnka, že shared_ptr je implementován přes reference counting, takže zabírá pamět, dá se oblbnout cyklickou referencí, žere CPU při copy/delete), případně jeho použití uzavřít do samostatného bloku?

    @ivan Když v Jave napíšeš "a=b; c=a;" a to c se pak nekam preda, nic divnýho se neděje. Neděje se ani COW, děje se to, že konceptuálně se v Javě předávají pouze reference na objekty, objekty se nikdy samy od sebe nekopírují. Když už na nějaký objekt žádná reference nevede, tak se v GC časem zamete.

    10.2.2015 20:18 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Tint3 v C++
    No, asi je to Javismus v tom smyslu, že prostě v těle té funkce getShapeFromUser nechci být nucen přemýšlet o tom, jak bude výsledek používán.
    Jenže to seš stejně vždycky nucen, a to jak co se správy paměti týče (v Javě je dán jeden způsob - to, že o něm v dané situaci nepřemýšlíš, neznamená, že neexistuje), tak i rozhraní.
    Single responsibility principle - getShapeFromUser se má starat o získání shape od uživatele, a nic víc. To považuji za základ composable softwaru - jednotlivé komponenty mohu psát odděleně, a to, jak si je potom sestavím, záleží až na konkrétní situaci.
    Souhlasim, ale myslim si, že nemá smysl tohle řešit na úrovni jednotlivých funkcí, nebo dokonce i tříd. Spíš až modulů.
    Jaký je v této situaci nejvhodnější návratový typ (pointeru)?
    Vždyť říkám, že to nemá jednoznačnou odpověď ;-) Ptáš se na C++ návratový typ pro Javovskou situaci, na to se nedá jednoznačně odpovědět.
    Pokud v tomto případě asyncPrint skončí rychle, během nesmírnědlouhotrvající práce bude shared_ptr na shape pořád alokovaný, je to tak?
    shared_ptr předáš kopií, tj. naalokovaná bude ta kopie vevnitř té dlouhé operace. Ta původní kopie může klidně zaniknout. Kopírování shared_ptr imho moc nežere (atomické integery). V paměti bude zabírat nejspíše stejně nebo méně jako hlavička objektu v JVM :-D Jinak cyklickou dependencí se oblbnout dá.
    10.2.2015 21:25 ava
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Ad Javismus, co se správy paměti týče: Je jen jeden způsob správy paměti, takže nejsem nucen přemýšlet nad tím, jaký zvolit. Navíc je ten způsob vždy spolehlivý.

    Ad composability: Proč bych to nemohl řešit na úrovni funkcí? Samozřejmě to ne vždy má smysl, ale když to smysl má, nemělo by mě v tom nic uměle omezovat. Funkcionální programování to řeší pouze na úrovni funkcí, a je v možnosti skládání krajně úspěšené.

    Ad nejvýhodnější typ pointeru. Vlastně nerozumím, čím je ta situace nějak specificky Javovská? Prostě chci implementovat funkci getShapeFromUser třeba do nějaké knihovny, a nemohu předvídat, jak se ji uživatelé rozhodnou použít. Je snad Javovské to, že nechávám to rozhodnutí na uživateli knihovny?

    Ad shared_ptr: Asi jsem špatně vyjádřil otázku, a možná i špatně chápu implementaci shared_ptr. Myslel jsem, že vzniká s čítačem referencí nastaveným na 1, když ho předám do toho asyncPrint, tak se někde inkrementne čítač referencí na 2, když skončí asyncPrint, tak se vrátí na 1, a když skončí i nesmírnědlouhotrvající operace a blok kódu, skočí na 0 a zavolá se destruktor referencovaného objektu (shape). Je to tak? Pokud ano, co konkrétně se mi nelíbilo bylo to, že nesmírnědlouhotrvající operace už shape k ničemu nepotřebuje, ale ten bude stejně dealokován až po jejím skončení (v tom konkrétním případě), zatímco GC by to uklidil o dost dřív. Snad bude po tomto vysvětlení moje původní otázka jasnější.
    10.2.2015 23:04 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Ad composability: Proč bych to nemohl řešit na úrovni funkcí? Samozřejmě to ne vždy má smysl, ale když to smysl má, nemělo by mě v tom nic uměle omezovat.
    No záleží, co je to za funkci, pokud je někde na rozhraní knihovny, tak to souhlas, ale pokud je to jen jedna z X funkcí třídy Y modulu Z, tak se dá předpokládat, že navrhuju modul Z jako celek a ty funkce navrhuju s ohledem na to, že budou nějakým způsobem spolupracovat (samozřejmě by z toho neměly vzniknout špagety, to je zas druhej extrém...).
    Vlastně nerozumím, čím je ta situace nějak specificky Javovská?
    V tom, že tě nenapdane uvažovat o vlastnitcví toho objektu (dokud nenarazíš na otázku převedení toho kódu do C++ nebo něčeho takového)...
    Prostě chci implementovat funkci getShapeFromUser třeba do nějaké knihovny, a nemohu předvídat, jak se ji uživatelé rozhodnou použít. Je snad Javovské to, že nechávám to rozhodnutí na uživateli knihovny?
    Když budeš tu knihovnu psát v C++, budeš se muset rozhodnout, jakým způsobem se bude spravovat doba života toho objektu a uživatel to bude muset respektovat. Nicméně dá se to řešit tak, aby to uživatele neomezovalo.
    Je to tak? Pokud ano, co konkrétně se mi nelíbilo bylo to, že nesmírnědlouhotrvající operace už shape k ničemu nepotřebuje, ale ten bude stejně dealokován až po jejím skončení (v tom konkrétním případě), zatímco GC by to uklidil o dost dřív.
    Ano je to tak a teď už rozumim otázce. Ty se můžeš vlastnictví toho objektu v shared_ptr zřeknout dřív, dokonce bys to tak měl udělat ve chvíli, kdy ten objekt už nepotřebuješ. Nemá smysl se ho držet dýl. V tom kódu výše bys mohl buď tu další práci přesunout za scope toho shared_ptr nebo na tom shared_ptr zavolat reset().

    Co se týče GC, jestli by něco uklidil dřív nebo později dost dobře nemůžeš vědět...
    11.2.2015 09:42 ava
    Rozbalit Rozbalit vše Re: Tint3 v C++
    OK, mohl bych se ještě vyptat na spoustu podrobností, ale myslím, že už mám představu, jak to v C++ se správou paměti zhruba vypadá. Moc díky za info, já zůstanu u svého pohodlného GC, a respekt těm, kteří přemýšlejí nad každou alokací :)
    11.2.2015 10:19 Ivan
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Ani v ty Jave se tomu nevyhnes. Pokud budes resit i jine prostredky nez je pamet. RAII je vlastne to same co try-with-resources z Javy 1.7. Tohle ale Java prevzala spis z C# nez z C++.

    Pokud jde o memory management v C++, tak si predstav, ze musis pouzivat AutoCloseable na vsechno (vcetne zamku).

    10.2.2015 20:43 Jindřich Makovička | skóre: 17
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Může nastat potřeba shared_ptr, pokud nedochází ke sdílení objektu mezi vlákny?
    Samozřejmě - např. pokud na ten objekt drží odkaz několik různých objektů a není jasné, kdo by měl být vlastník, ani kdo zůstane naživu jako poslední a uklidí.
    dá se oblbnout cyklickou referencí
    Proto kromě shared_ptr existuje ještě weak_ptr.
    10.2.2015 21:30 ava
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Ještě nad tím musím podumat, už mám unavenou makovici (no pun intended :). Nebo bys měl nějaký triviální příklad, kdy je v jednovláknovém kódu shared_ptr nevyhnutelný? (když vynechám explicitní správu paměti, samozřejmě). Díky..
    11.2.2015 08:24 Jindřich Makovička | skóre: 17
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Např.

    std::unique_ptr<Shape> readShape() { ... }

    ....

    {

    std::list<std::shared_ptr<Shape> > obdelniky;

    std::list<std::shared_ptr<Shape> > zelene;

    ...

    std::shared_ptr<Shape> tmp = readShape();

    if (tmp.je_obdelnik()) obdelniky.push_back(tmp);

    if (tmp.je_zeleny()) zelene.push_back(tmp);

    ...

    /* na konci scope se vsechno uklidi */

    }

    Samozřejmě se shared_ptr dá často obejít (tady třeba uložením unique pointerů do dalšího seznamu, který bude jednoznačný vlastník a výše uvedené seznamy budou obsahovat obyčejné pointery), ale někdy se kvůli pohodlí hodí.
    11.2.2015 09:03 ava
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Jasně, jak prosté.. Díky za příklad. Jen detail, deklaruješ readShape tak, že vrací unique_ptr, ale tmp je shared_ptr. Konverze probíhá automaticky, nebo je to překlep?
    11.2.2015 09:33 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Myslimže by tam mělo být std::move().
    11.2.2015 09:47 Jindřich Makovička | skóre: 17
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Může, ale je to zbytečné, protože readShape() vrací rvalue.
    11.2.2015 10:07 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Tint3 v C++
    11.2.2015 09:50 Jindřich Makovička | skóre: 17
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Ano, to jsem tam dal úmyslně pro ilustraci automatické konverze unique na shared :)
    11.2.2015 09:57 Ivan
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Pokud v tomto případě asyncPrint skončí rychle, během nesmírnědlouhotrvající práce bude shared_ptr na shape pořád alokovaný, je to tak? Rozumím tomu správně, že abych ho uvolnil včas, musel bych ho explicitně dekrementnout (je správná moje doměnka, že shared_ptr je implementován přes reference counting, takže zabírá pamět, dá se oblbnout cyklickou referencí, žere CPU při copy/delete), případně jeho použití uzavřít do samostatného bloku?
    shared_ptr muze zabirat i 40B. V zavislosti od toho, co od nej ocekavas. Muze totiz obsahovat krome poiteru a citace i mutex anebo poiter na deleter funkci. S cyklickou referenci jsem se jeste nepotkal - i kdyz netvrdim ze to nemuze nastat. Automaticky pointer chapu jako vlastnika. Napriklad kdyz vytvarim pri parsovani AST (strom), tak sipky od korene smerem dolu jsou unique_ptr, protoze node "vlastni" svoje syny. Zatimco pointery smerem nahoru k otci jsou obycejne pointery (anebo observer_ptr).

    shared_ptr znamena sdilene vlastnictvi objektu - sdilenou odpovednost za objekt. Coz je sam o sobe problem - ve vetsine pripadu staci unique_ptr. Cyklicka reference potom znamena, ze se vsechny objekty vlastni nejak navzajem - coz je blbost.
    10.2.2015 19:04 ivan
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Tohle je v C++ trochu slozitejsi. Krome toho, ze resis business logiku, tak musis resit i "vlastnictvi" objektu. Mezi automatickyma poitrama se da vselijak cast-ovat.

    pokud by getShapeFromUser byla tovarna, ktera nejak sleduje instance, ktery vytvorila, tak by asi mela vracet shared_ptr. V pripade unique_ptr by to vypadalo:
    {
     unique_ptr<Shape> shape = std::make_unique<Shape>(getShapeFromUser());
    
     if (userWantsAPrintout()) {
        asyncPrint.push(std::move(shape));
        anebo
        asyncPrint.push(shape.get());
     }
    
     if (userWantsToSeeTheShapeInAViewer()) {
        a tady uz to nefunguje.
     }
    }
    
    Tady opdavdu jde o to kdo tu instanci vlastni a ten je potom zodpovedny, za jeji zruseni. Z jedne intance unique_ptr do druhe se prirazuje pomoci std::move (resp. std::swap).

    Pokud se ta pravidla, zmeni tak je to potreba celkem slozite refactorovat.

    PS: tohle
    shared_ptr<Shape> s_ptr = std::make_shared<Shape>(std::move(u_ptr));
    
    vyzvedne instanci z unique_ptr a vlozi ji do shared_ptr.
    10.2.2015 19:17 ivan
    Rozbalit Rozbalit vše Re: Tint3 v C++
    V tom tvym prikladu by se pouzil shared_ptr. S tim, ze se vlastne nevi ve kterym vlakne by se vlastne ten Shape rusil.

    V pripade Qt frameworku, by se poslala zprava do hlavniho vlakna, ze se ma shape zrusit. V Qt maji objekty thread afinity a nici se v tom vlakne ve kterem vznikly.
    10.2.2015 19:22 ivan
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Ted me napada, ze Java vlastnictvi objetku nijak neresi nekdy se pak deji divny veci, kdyz napises "a=b; c=a;" a to c se pak nekam preda. Nastesti jsou v Jave zakladni tridy imtutable, coz je vlastne COW.
    10.2.2015 20:52 Jindřich Makovička | skóre: 17
    Rozbalit Rozbalit vše Re: Tint3 v C++
    shared_ptr<Shape> s_ptr = std::make_shared<Shape>(std::move(u_ptr)); vyzvedne instanci z unique_ptr a vlozi ji do shared_ptr.
    shared_ptr<Shape> s_ptr(std::move(u_ptr)) by mělo stačit.
    11.2.2015 11:30 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Ještě k té implementaci, v C++11 se dá využít RAII + lambda funkcí pro v podstatě jakýkoli úklid kdekoli, třeba takhle. Ale je to trochu ad-hoc řešení, většinou je lepší nechat každý objekt, aby si spravoval svoje resources...
    David Šmíd avatar 10.2.2015 18:49 David Šmíd | skóre: 10 | blog: dsmid
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Ad 2: V C++ existuje standardní funkce async(), která dělá přesně to, co potřebuješ.

    Není mi jasné, co by na tom pseudokódu mělo být složité k implementaci.

    Není to triviální?

     


    Jediné "intuitivní" rozhraní je bradavka. Všechno ostatní se musíte naučit. -- Bruce Ediger, o uživatelském rozhraní
    10.2.2015 16:49 koudy
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Co když potřebuji u toho bufferu měnit jeho velikost? (konec zprávy je definován např. 0xFF, ale již není známa maximální délka vstupu a navíc potřebuju ten buffer uložit na nějakou dobu, například kvůli opakování/odpovědi a zároveň mezi tím přijímat další data z toho samého IO)

    Nebo - co když já jsem ten, kdo knihovnu píše?

    Dík za knížku, sice jsem nikdy nebyl typ "přečti a pracuj", spíše "vyzkoušej a pochop" no a s tou prací to taky nikdy nebyla výhra, třeba do ní nahlédnu, pokud se rozhodnu oprášit C++ znalosti, nebo spíš se to naučit znovu, protože jak koukám, už je to úplně jiný jazyk než co si pamatuju...(zamrz jsem někde na C++ 98/03 :D )
    10.2.2015 17:28 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Co když potřebuji u toho bufferu měnit jeho velikost?
    Tyhle kontejnery jako deque a podobné mají dynamickou velikost, jinak by byly celkem k prdu ;-)
    11.2.2015 06:32 Jindřich Makovička | skóre: 17
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Co se knih týče, pro přehled, co je v C++11/14 nového, doporučuji Effective Modern C++ od Scotta Meyerse. I na youtube se dá najít řada přednášek na tohle téma.
    little.owl avatar 16.2.2015 00:44 little.owl | skóre: 22 | blog: Messy_Nest | Brighton/Praha
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Navíc bych nepovažoval C++ za zrovna bezpečný a blbu-vzdorného.
    C++ umoznuje psat bezpecny kod a od revize C++11/14 je k tomu dosti nastroju.
    Minimálně bych se poohlížel po něčem co má garbage collector.
    Neni vubec potreba.
    A former Red Hat freeloader.
    10.2.2015 13:30 7R7 | skóre: 8
    Rozbalit Rozbalit vše Re: Tint3 v C++
    Chvíľku som používal tint2 v OpenBoxe ale opustil som ho kvôli tomu že nemal v sebe ukazovateľ plôch a žiadna alternatívna aplikácia nefungovala korektne, tak som prešiel na xfce-panel.

    Založit nové vláknoNahoru


    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.