abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 05:33 | Pozvánky

    Protože je už po aprílu, můžou strahováci opět zveřejnit program další Virtuální Bastlírny, aniž by připravená témata působila dojmem, že jde o žert. Vězte tedy, že již v úterý 7. dubna od 20:00 proběhne VB, kde se setkají bastlíři, technici, učitelé i nadšenci do techniky a kde i vy se můžete zapojit do družného hovoru, jako by všichni seděli u pomyslného piva. Co mají bastlíři tento měsíc na srdci? Pravděpodobně by nás musel zasáhnout meteorit

    … více »
    bkralik | Komentářů: 0
    včera 23:33 | Nová verze

    Byla vydána verze 26.1 aneb čtvrtletní aktualizace open source počítačového planetária Stellarium (Wikipedie, GitHub). Vyzkoušet lze webovou verzi Stellaria na Stellarium Web.

    Ladislav Hagara | Komentářů: 1
    včera 23:00 | Zajímavý projekt

    VOID (Video Object and Interaction Deletion) je nový open-source VLM model pro editaci videa, který dokáže z videí odstraňovat objekty včetně všech jejich fyzikálních interakcí v rámci scény (pády, kolize, stíny...) pomocí quadmaskingu (čtyřhodnotová maska, která člení pixely scény do čtyř kategorií: objekt určený k odstranění, překrývající se oblasti, objektem ovlivněné oblasti a pozadí scény) a dvoufázového inpaintingu. Za projektem stojí výzkumníci ze společnosti Netflix.

    NUKE GAZA! 🎆 | Komentářů: 0
    včera 05:22 | Zajímavý software

    Design (GitHub) je 2D CAD pro GNOME. Instalovat lze i z Flathubu. Běží také ve webovém prohlížeči.

    Ladislav Hagara | Komentářů: 12
    včera 04:11 | Zajímavý software

    Příspěvek na blogu herního enginu Godot představuje aplikaci Xogot přinášející Godot na iPad a iPhone. Instalovat lze z App Storu. Za Xogotem stojí Miguel de Icaza (GitHub) a společnost Xibbon.

    Ladislav Hagara | Komentářů: 1
    4.4. 04:22 | Komunita

    Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za březen (YouTube).

    Ladislav Hagara | Komentářů: 13
    3.4. 16:44 | Nová verze

    ESP-IDF (Espressif IoT Development Framework), tj. oficiální vývojový framework pro vývoj aplikací na mikrokontrolérech řady ESP32, byl vydán v nové verzi 6.0. Detaily na portálu pro vývojáře.

    Ladislav Hagara | Komentářů: 0
    3.4. 12:33 | Nová verze

    DeepMind (Alphabet) představila novou verzi svého multimodálního modelu, Gemma 4. Modely jsou volně k dispozici (Ollama, Hugging Face a další) ve velikostech 5-31 miliard parametrů, s kontextovým oknem 128k až 256k a v dense i MoE variantách. Modely zvládají text, obrázky a u menších verzí i audio. Modely jsou optimalizované pro běh na desktopových GPU i mobilních zařízeních, váhy všech těchto modelů jsou uvolněny pod licencí Apache 2.0. Návod na spuštění je už i na Unsloth.

    NUKE GAZA! 🎆 | Komentářů: 11
    3.4. 03:55 | Nová verze

    Cursor (Wikipedie) od společnosti Anysphere byl vydán ve verzi 3. Jedná se o multiplatformní proprietární editor kódů s podporou AI (vibe coding).

    Ladislav Hagara | Komentářů: 0
    2.4. 19:55 | Zajímavý projekt

    Průkopnická firma FingerWorks kolem roku 2000 vyvinula vícedotykové trackpady s gesty a klávesnice jako TouchStream LP. V roce 2005 ji koupil Apple, výrobu těchto produktů ukončil a dotykové technologie využil při vývoji iPhone. Multiplatformní projekt Apple Magic TouchstreamLP nyní implementuje funkcionalitu TouchStream LP na současném Apple Magic Trackpad, resp. jejich dvojici. Diskuze k vydání probíhá na Redditu.

    |🇵🇸 | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (14%)
     (7%)
     (1%)
     (12%)
     (30%)
     (3%)
     (6%)
     (1%)
     (14%)
     (23%)
    Celkem 1223 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník

    Dotaz: Uvolňování paměti v C++

    Jan Zahornadsky avatar 17.6.2006 10:50 Jan Zahornadsky | skóre: 22 | blog: hans_blog
    Uvolňování paměti v C++
    Přečteno: 710×
    Pěkný den všem,

    chtěl bych se zeptat, jak funguje ubolňování paměti v Linuxu v C/C++. Mám totiž jednu stromovou strukturu (opravdu hodně velkou), kde je každý uzel třída, delete-ují se rekurzivně. Valgrind nehlásí žádný memory leak. Ale když třeba na konec programu přidám sleep(30) a kouknu na top, stále vidím, že můj program zabírá přes 270MB. Ale například miniaturní demo
            const int HODNE = 10000;
            char **pole = new char*[HODNE];
            for (int i = 0; i < HODNE; i++)
            {
                    pole[i] = new char[HODNE];
    //                for (int j = 0; j < HODNE; j++) pole[i][j] = 0;
            }
            sleep(30);
            for (int i = 0; i < HODNE; i++) delete [] pole[i];
            delete [] pole;
            sleep(30);
    
    si ani tu paměť nealokuje. Pokud však odkomentuji jeden z těch řádků, tak až pak mi kernel tu paměť opravdu přidělí. To je docela zajímavá myšlenka, dokáže to skutečně dát programu jen tu paměť co kdy použije. Co mě ale mnohem víc zaráží, je, když sleduji tento program v topu, tak jeho paměť je uvolněna de facto hned po delete.

    Neví někdo, jaký algoritmus používá jádro pro určení, kdy paměť uvolní a kdy alokuje (i link by byl supr, asi hledám blbě :-( )? Nebo je možné, že valgrindu uniklo těch 270MB, co můj program má stále přidělených těsně před koncem, po všech deletech?

    Předem díky!
    Actually, I was half an hour into the pointer scripting documentation when she got dressed and left.

    Odpovědi

    17.6.2006 11:03 #Tom | skóre: 32 | blog: Inspirace, aneb co jsem kde vyhrabal
    Rozbalit Rozbalit vše Re: Uvolňování paměti v C++
    Jádro paměť přiděluje i tehdy, když jí není dost, spoléhá se na to, že jí nebude tolik potřeba. (Na to je volba sysctl vm.overcommit_memory). Přiděluje se ale asi až po prvním použití (jako v tom cyklu), kdy se po uvolnění v programu uvolní doopravdy, to asi také závisí na situaci – kdyby paměť docházela, jádro by ji asi uvolnilo dřív.
    Jan Zahornadsky avatar 17.6.2006 11:08 Jan Zahornadsky | skóre: 22 | blog: hans_blog
    Rozbalit Rozbalit vše Re: Uvolňování paměti v C++
    To uvolňování mi právě nejde do hlavy, 270MB neuvolní hned, to čeká až na konec programu, kdežto těch cca 100MB co udělá uvedené demo se uvolní hned. Ještě zkusím nějaké demo s třídami, ale nevím, proč by se na to mělo pohlížet odlišně.
    Actually, I was half an hour into the pointer scripting documentation when she got dressed and left.
    Jan Zahornadsky avatar 17.6.2006 13:24 Jan Zahornadsky | skóre: 22 | blog: hans_blog
    Rozbalit Rozbalit vše Re: Uvolňování paměti v C++
    Tak teď už nevím. Toto demíčko:
            CString ***tridy = new CString**[HODNE];
            for (int i = 0; i < HODNE; i++)
            {
                    tridy[i] = new CString*[MENE];
                    for (int j = 0; j < MENE; j++)
                    {
                            tridy[i][j] = new CString();
                            tridy[i][j]->Append("kraviny v pameti");
                    }
            }
    
            printf("Pamet v tridach alokovana.\n");
            sleep(30);
    
            for (int i = 0; i < HODNE; i++)
            {
                    for (int j = 0; j < MENE; j++) delete tridy[i][j];
                    delete [] tridy[i];
            }
            delete [] tridy;
    
            printf("Pamet v tridach uvolnena.\n");
            sleep(30);
    
    (CString je třída, která uchovává řetězec v dynamicky alokovaném poli)

    Funguje, jak bych čekal (tj. po posledním sleepu zabírá program třicet vteřin minimum paměti). Je možné, že mi valgrind u mého programu něco tají? (napsal ale "No memory leaks possible")

    Pokud by to někoho zajímalo, tak se jedná o třídu implementující Patricii, ten testovací program do ní vloží postupně každý řádek souboru, pak postupně z ní každý záznam odstraní a pak nechá ještě zapůsobit destruktor (který zavolá rekurzivně destruktor na potomky uzlu -- žádni by ale zůstat neměli).
    Actually, I was half an hour into the pointer scripting documentation when she got dressed and left.
    Jan Zahornadsky avatar 18.6.2006 23:25 Jan Zahornadsky | skóre: 22 | blog: hans_blog
    Rozbalit Rozbalit vše Re: Uvolňování paměti v C++
    Pokračuji ve výzkumu... Zdá se, že Linux i Solaris na uvolnění té paměti nespěchají, kdežto Windows ano (co je ještě hezčí je, že tatáž struktura si sní cca 277MB na Linux 64bit, 151MB na Solarisu 32bit a konečně cca 250MB na Windows 32bit).
    Actually, I was half an hour into the pointer scripting documentation when she got dressed and left.
    19.6.2006 07:50 Martin
    Rozbalit Rozbalit vše Re: Uvolňování paměti v C++
    Tiež by ma zaujímalo ako je to s uvoľňovaním pameti, pretože ma toto správanie dosť prekvapilo. A k tomu príkladu. Aké si použil možnosti kompilátora? -0s || -O2 ???
    wake avatar 19.6.2006 08:24 wake | skóre: 30 | blog: wake | Praha
    Rozbalit Rozbalit vše Re: Uvolňování paměti v C++
    no, a co se takhle podivat do libc, jak je napsany malloc, calloc, realloc, free, new a delete? mezi volanim malloc[libc] a volanim brk[kernel] je spousta kodu.
    Tento příspěvek má hlavičku i patičku!
    19.6.2006 08:34 pzad | skóre: 30 | blog: pzad
    Rozbalit Rozbalit vše Re: Uvolňování paměti v C++
    libc alokuje pamat od jadra vo velkych blokoch a potom ju deli na mesie kusky. Vratit jadru ju moze az ked je volny cely blok. Pri pridelovani sa pamat fragmentuje, takze sa moze stat, ze sa tam vzdy nieco najde, co nie je este volne.
    Jan Zahornadsky avatar 19.6.2006 23:57 Jan Zahornadsky | skóre: 22 | blog: hans_blog
    Rozbalit Rozbalit vše Re: Uvolňování paměti v C++
    To zní pravděpodobně. Je nějaká možnost, jak tuto fragmentaci odhalit a optimalizovat to? Protože se mi nelíbí, že pokud bych tuto část použil v předzpracování, aby kvůli možná jediné proměnné nešťastně v main() se neuvolnilo řádově desítky až stovky MB...
    Actually, I was half an hour into the pointer scripting documentation when she got dressed and left.
    20.6.2006 00:03 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Uvolňování paměti v C++
    Jedna možnost, když už se bavíme o C++, je napsat si pro tyto účely vlastní implementaci operátorů new, new[], delete a delete[]. Otázkou samozřejmě je, zda se vám do toho bude chtít.
    Jan Zahornadsky avatar 20.6.2006 00:08 Jan Zahornadsky | skóre: 22 | blog: hans_blog
    Rozbalit Rozbalit vše Re: Uvolňování paměti v C++
    To ale bude pak nutně platform-specific, ne? :-/
    Actually, I was half an hour into the pointer scripting documentation when she got dressed and left.
    20.6.2006 01:40 Kyosuke | skóre: 28 | blog: nalady_v_modre
    Rozbalit Rozbalit vše Re: Uvolňování paměti v C++
    Nebude, pokud budete používat ve svých alokátorech přenositelné konstrukce. ;-) Nebo mě aspoň nic zádrhelovitého nenapadá. Možná v Boostu by se daly vyštrachat nějaké příklady ma tohle téma.
    20.6.2006 08:10 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Uvolňování paměti v C++
    Ne nutně, podle manuálové stránky by syscall mmap() měl odpovídat POSIXu, takže přinejmenším na POSIXových systémech by to přenositelné být mělo. A i kdybyste to chtěl portovat třeba na win32, mělo by stačit udělat variantní tu část, která získává od systému kus paměti. Rozparcelování těch bloků už si uděláte univerzálně, v podstatě stačí dát pozor na zarovnávání toho, co vracíte.
    Jan Zahornadsky avatar 19.6.2006 10:14 Jan Zahornadsky | skóre: 22 | blog: hans_blog
    Rozbalit Rozbalit vše Re: Uvolňování paměti v C++
    Co se optimalizací týče, tak jak v Solarisu, tak ve VS (2005 verze, nevím, jestli se to nějak výrazně mění) jsem ponechal standardní nastavení (tj. bez jakýchkoli flagů kompilátoru). V linuxu jsem zkoušel různé nastavení, jak bez optimalizace, tak O2, Os, O3, ale spotřeba paměti se nezměnila.
    Actually, I was half an hour into the pointer scripting documentation when she got dressed and left.
    20.6.2006 08:23 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
    Rozbalit Rozbalit vše Re: Uvolňování paměti v C++
    Však to je spíš věc glibc, jestli se rozhodne volnou pamět skutečně uvolnit nebo ne.
    20.6.2006 08:46 Jirka
    Rozbalit Rozbalit vše Re: Uvolňování paměti v C++
    Alokace a uvolnovani dynamicke pameti zavisi na alokatoru (implementaci mallocu a spol.). Malloc je v linuxu implementovan volanim brk(), ktere pouze posunuje hranici heapu. Pri uvolneni pameti se blok oznaci jako volny, ale nevrati se uz zpet operacnimu systemu (hranice heapu se zpet uz neposune). Posunuti heapu (tj. vraceni pameti OS) lze vynutit pomoci malloc_trim, coz ovsem neni prenositelne.

    Jinak jeste existuje prah velokosti alokovaneho bloku. Pokud se alokuje vice pameti nez je tento prah, provadi se prideleni pameti volanim mmap(), tj. mapovanim stranek. Pokud se takovato pamet uvolni, je skutesne vracena zpet OS. Tento prah lze nastavovat, napr. funkci mallopt() nebo i promennou prostredi MALLOC_MMAP_THRESHOLD_. Jaka je defaultni hodnota si nejsem jisty.

    Pro vypis alokovanych bloku je velice uzitecna funkce mallinfo. viz /usr/include/malloc.h.
    20.6.2006 09:02 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
    Rozbalit Rozbalit vše Re: Uvolňování paměti v C++
    Wow, zase jsem se něco přiučil :)
    20.6.2006 10:06 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Uvolňování paměti v C++
    Pokud to nebylo myšleno jako ironie, doporučil bych článek na Linux Journal nebo pojednání u IBM.
    20.6.2006 12:03 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
    Rozbalit Rozbalit vše Re: Uvolňování paměti v C++
    Ne, to skutečně nebyla ironie.
    20.6.2006 13:07 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Uvolňování paměti v C++
    OK, jen jsem si nebyl jistý, jak mám chápat ten smajlík.

    Založit nové vláknoNahoru

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

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