• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    XCHAOSANSI C/C99 (specifikace), GNU C (gcc, glibc), Tiny C (tcc) a POSIX - ne nutně C++,g++,libstdc++ nebo Win32 API
    XCHAOS
    XCHAOS --- ---
    DAVIDOWITCH: no ano, na to se tu ptal i id REDGUY

    víceméně, opustil jsem svoje plány na "pojmenované" paměťové kontexty (memory pooly) a rozhodl se, že ve většině případů potřebuju paměť v kontextech rememeber { } a forget { }, které se do sebe bude možné navíc vnořovat a které se budou vzájemně přebíjet.

    není to žádný magic - uvnitř makra bude jediná jednoprůchodová for(;;) smyčka, která udělá nějakou inicializaci a nějakou deincializaci (je vtipné, kam všude dnes cpu cyklus for(), když prvních 10 let jsem v C programoval zarputile jen pomocí while() do { } while(), protože mi for() přišlo matoucí... a dodnes přijde, vždyť se taky "skutečné programování" snažím dělat zásadně jen pomocí for_each() :-) :-)

    forget { forget { .... } } a remeber { remeber { .... } } jsou triviální případy ... jinak vnoření odlišného je taky téměř triviální:

    remeber { a=nezahazuju; forget { b=zahazuju; remeber { c=nezahazuju; } d=zahazuju; } e=nezahazuju; }

    a,c,e musí po vystoupení z vnějšího remember zůstat definované
    b,d se uvolní v bodě, kde končí ten scope forget
    atd.

    toto je podle mě jednak fakt srozumitelné, jednak to musí být vnořovatelné (bude tam nějaká skrytá řídící globální proměnná, která řekne těm makrům, jaký je aktuální kontext), jednak je implementace téměř triviální (podotýkám téměř, protože ty memory pooly budou přeci jen řešené trochu komplexněji...)

    původní plán byl na "pojmenované" a "nepojmenované" kontexty... ale postupem času mi došlo, že ty pojmenované jsou úplná blbost (nebo skoro úplná blbost - mají asi takové oprávnění, jako příkaz goto - který víceméně nemá moc oprávnění, pokud zavedeme systém odchycení a ošetření vyjímek ...)
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    XCHAOS: co takhle rozlisovat array (proste pole tady zacina a tot vse co vis) a safe_array (tady zacina a mas pro nej alokovany tolik pameti)?
    Kdybys chtel jeste resit kolik tech prvku je platnejch, tak nejspis budes chtit rovnou udelat to pole nafukovaci ala vector jak pise Jachymko.
    REDGUY
    REDGUY --- ---
    XCHAOS: Ano, to je pravda. O sebehorsim bugu muzes prohlasit ze to je feature 8)
    A co se zasluh tyce, opravdu mi nemusis zadne "priznavat". Desi me predstava ze bych se nekdy dozvedel ze "mam zasluhy na Cll1", to bych v CV fakt nechtel 8) Ale znovu - ptal jsi se, co jsem dokazal, odpovedel jsem ti. To neni delani humbuku, to neni pozadovani zasluh, to je cirocire zdvorile odpovidani na otazku a konstatovani faktu. Pokud se ti nelibi odpoved, priste povaz, jestli nebude lepsi otazku vubec neklast 8) (Alternativne, pro extra komicky efekt, muzes zacit vysvetlovat ze upozornovat na chyby bez toho, abych je za tebe opravil, je vlastne spatne. Nemuzu se dockat 8) )
    _BENNY
    _BENNY --- ---
    XCHAOS: muzes v tom udelat mrdnik a jednom rikat array a druhemu field ;)
    XCHAOS
    XCHAOS --- ---
    a když tu máme tolik mudrců, co bazírujou na terminologii: jak byste terminologicky rozlišili pole známé a neznámé délky (nezaměňovat s null-terminated stringy, to je ještě jiný případ) ?

    je "array" spíš označení pro pole známé délky - nebo prostě pro obecné pole ?
    bylo by vhodné použít označení "buffer" pro pole neznámé délky a "array" pro pole známé délky ?

    chci totiž vymyslet pro svůj dialekt C pseudo-třídu polí, které budou doprovázeny informací o alokované velikosti - a tudíž iterovatelné přes všechny prvky, apod. - ale nerad bych hned od začátku terminologicky šlápl mimo mísu.

    může být "vector" vhodné jako označení pro pole známé délky, pokud "array" zůstane označení pro pole neznámé délky ?
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    tak logicky, protoze kdyz to nejdriv vsechno naalokujes a pak uvolnis, tak nejspis budes od OS potrebovat vic stranek a to zase bude o neco dyl trvat. Plus umi bejt v 32b programech obcas problem s fragmentaci a tak.

    tj. delas mempool pres nejakou macro magic?
    XCHAOS
    XCHAOS --- ---
    DAVIDOWITCH: a co pořadí uvolňování - to by na rychlost taky mohlo mít vliv, ne ?
    tedy, kdybys měl na uvolňování druhou smyčku.

    "u mě" v mém chystaném dialektu bude zápis

    forget
    {
    repeat(100)
    {
    int *ptr=get(array,int,100);
    }
    }

    provedený skutečně jen s jedním malloc() a jedním free() ...
    XCHAOS
    XCHAOS --- ---
    REDGUY: opravdové zásluhy přiznávám těm, kdo chyby opravují...

    a ani jinak není chyba jako chyba - to, že o něčem zjistíš, že to "nejde použít tak, jak bys chtěl" nestačí, abys mohl říct, že je tam "chyba"...
    REDGUY
    REDGUY --- ---
    XCHAOS: až najdeš bug v nějakým mým releasu, tak kolem toho dělej takovej humbuk - humbuk? Ty ses ptal co jsem predvedl a ja ti odpovedel, ze jsem nasel a ukazal ti chyby v tvem kodu. Normalni clovek by za to podekoval, ne nadaval - ale opet, chapu ze to je tvuj emocialni problem se mnou 8)

    btw, pri zbeznem pohledu bych rekl, ze tvuj (ne-release) crl1 je brutalne rozbitej z hlediska mnohonasobneho vyhodnocovani argumentu maker a chybejicich zavorek kolem nej. Skoro jsem myslel ze tohle uz jsem ti pred par rokama vysvetlil, ale asi jsi to vytesnil. Chces to vysvetlit znova? 8))
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    XCHAOS: Hmm.. no, to je slozitejsi, protoze zalezi jak definujes "to same". Pokud chces aby udelaly stejny memory operace, tak mne nenapada jak to zaridit. Protoze, pokud se nepletu, tak zatimco:
    Cckovy
    for(int i=0; i<100; i++)
    { int *ptr = malloc(100*sizeof(int)); /* do stuff */; free(ptr);}
    a C++
    for(int i=0; i<100; i++)
    { int *ptr = new int[100]; /* do stuff */; delete [] ptr;}

    delaj vesmes to samy (100x naalokuje, 100x uvolni),
    tak kdyz udelas tu druhou smycku v Jave, tak to zoptimalizuje na 1 alokaci, 1 uvolneni.
    XCHAOS
    XCHAOS --- ---
    DAVIDOWITCH: no tak právě proto bych řeč rád stočil třeba nato, jestli existují nějaké benchmarky testující rychlost a efektivitu mechanismů alokace paměti...

    a to samozřejmě nejen pro C... ale i rozšířené vyšší jazyky. srovnávací benchmarky - u kterých by ale bylo jasně vidět, že "dělají to samé"
    XCHAOS
    XCHAOS --- ---
    REDGUY: tak víš co ? až najdeš bug v nějakým mým releasu, tak kolem toho dělej takovej humbuk. pokud kritizuješ věci v těžce vývojovým SVN, tak prostě buď spolupracuj a commituj návrh oprav - a nebo drž papulu.
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    XCHAOS: Popravde, ja si myslim ze v Ccku bys to nemel chtit delat automaticky.
    Pokud neprepodkladas ciste single threaded single process kod, tak ty refcounty (a obecne jakykoliv garbage collection mechanismy) sou hodne drahy kvuli nejakejm atomicum a mutexu. A pak to chce peclive zvazit kdy a jak to presne pouzit.
    Napriklad v nejaky kriticky sekci si dovedu snadno predstavit ze, kdyz uz tam musis dynamicky alokovat, tak nechces dalsi overhead co se refcountu tyce.

    A teda predpokladam, ze pokud mas v planu delat v Ccku nejaky weboviny, tak to bude multithreaded a/nebo multiprocess, pripadne do budoucna timhle smerem rozsiritelny, kdyz uz dneska pomalu nezakopnes o single-core procesor.
    REDGUY
    REDGUY --- ---
    XCHAOS: To je mi popravde receno uplne jedno 8)
    XCHAOS
    XCHAOS --- ---
    JACHYMKO: je to pravda, taky je to jen mírný offtopic.

    podstatné jádro diskuze bylo, že v samotném C sice máme velkou volnost použít nějaký exotický alokátor paměti a různé přístupy ke garbage collection - ale žádná knihovna nám nemůže přetížit tak základní věc, jako chování pointerů.

    v C jde dělat různé krkolomné věci - viz třeba flow control makra, apod. - ale nejde tam nijak jednoduše zařídit, aby se při každé operaci přiřazení nebo na konci scope automaticky zavolal nějaký kód.
    XCHAOS
    XCHAOS --- ---
    REDGUY: našel si bugy v něčem, co jsem _releasnul_ ?
    REDGUY
    REDGUY --- ---
    XCHAOS: co si tedy tak úžasného už předvedl ty - kdyz uz nic jineho, nasel jsem par bugu v tvych programech, naucil te par novych veci a pri tom vyvratil par tvych bludu. Coz by pro zacatek mohlo stacit 8)

    z jakého titulu vlastně tenhle klub neustále zahrnuješ tak sžíravou kritikou - copak, potrebuju na to tvoje povoleni? Ja myslel ze od toho diskusni kluby jsou, aby se v nich tribily myslenky. To ze tvoje myslenky casto za moc nestoji (z ruznych duvodu) a pritahuji kritiku je jen nestastna shoda okolnosti 8)
    XCHAOS
    XCHAOS --- ---
    DAVIDWITCH, JACHYMKO: toto je všechno hezké a zajímavé, ale připomínám, že na NYXu je přece krásný lesklý plyšový klub o C++ - tak s tímto prosím (v tomto rozsahu obecně a co se týče Windows zvláště) jděte tam: tady je to určené spíše pro výměnu zkušeností lidí, co se snaží programovat v C99 a pod GNU/Linuxem.
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    JACHYMKO: jo, to prefixovani bylo peklo. Ja ale narazil az primo na to Managed C++ (coz bude ono C++/CLI). Proste sem misto MFC chtel pouzit WinForms a tohle na mne baflo. :-)
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    XCHAOS: Ono kdyby to C++ umelo a delalo automaticky, tak asi zacnu aktivne hledat nejakej programovaci jazyk co mi da na vyber. Libovolny takovyhle chytry mechanismy maj overhead, treba u refcountu to musi bejt threadsafe (tj. nejaky mutexy, atomicky countery) coz neni zadarmo.
    Jinak treba M$ ma vlastni rozsireni C++ standardu pro spolupraci s .NET, kde to ma dalsi 2 znaminka pro pointery (^) a reference (%, hmm.. mozna opacne) ktery jsou garbage collected. (ale jestli to pouziva prave refcounty nevim, ony jsou fakt dost neefektivni, jakmile mas k dispozici prekladac).
    Kliknutím sem můžete změnit nastavení reklam