• ú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
    /* Toto je klub především pro lidi, pro které je programování jednou z mnoha massive multiplayer online počítačových her, které lze hrát.
        V tomto klubu hrozí sémantická hereze a nezdravě vysoký obsah syntaktického cukru. Nevhodné pro algoritmické diabetiky.
        Od účastníků debaty se předpokládá automaticky přístup k instalovanému GNU C: sudo apt-get install build-essential
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    C (programovací jazyk)#C99 Heslo na české Wikipedii
    Jazyk C - Základy praktického programování V Praze 2oo7 pro SSPŠ Tomáš Harvie Mudruňka a kolektiv - jak si programování v C představuje většina lidí
    http://stevenkobes.com/ctest.html C Programming Puzzlers - nepouštějte se do flamewars v tomhle klubu, pokud neuhodnete aspoň polovinu správně!
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    http://en.wikipedia.org/wiki/C99 C99 is a modern dialect of the C programming language.
    http://cprogramminglanguage.net/ C programming language
    http://cprogramminglanguage.net/c-programming-language-tutorial.aspx C programming language - úvod
    http://en.wikipedia.org/wiki/Criticism_of_the_C_programming_language C makes it easy to shoot yourself in the foot. (ještě že ne do hlavy...)
    http://en.wikipedia.org/wiki/C_preprocessor
    http://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html C99 makra s proměnným počtem argumentů - __VA_ARGS__
    http://gcc.gnu.org/onlinedocs/gcc/ GNU C Compiler
    http://gcc.gnu.org/onlinedocs/gcc-4.2.2/gcc/Optimize-Options.html
    http://bellard.org/tcc/ Tiny C Compiler - prý C99 compliant (min. umí __VA_ARGS__) - vhodný pro skriptování v C - umí #!/usr/bin/tcc -run
    http://en.wikipedia.org/wiki/International_Obfuscated_C_Code_Contest - pokud jste neviděli tohle, tak jste ještě neviděli opravdu nečitelný C zdroják
    http://bellard.org/otcc/ Obfuscated Tiny C Compiler - z tohohle vtípku vznikl Tiny C compiler
    http://en.wikipedia.org/wiki/ANSI_C Jak se střelit do nohy standardizovaným způsobem.
    http://eli-project.sourceforge.net/c_html/c.html ANSI C Specification
    http://www.lysator.liu.se/c/ Různý ANSI C bordel
    http://www.cs.rit.edu/~ats/books/ooc.pdf Object Oriented Programming with ANSI-C - a pak že to nejde
    http://en.wikipedia.org/wiki/Longjmp co jsou to setjmp()/longjmp() knihovní funkce (pro všechny, podle kterých to bez C++ try { } catch() ... nejde)
    http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/dcdc710c27f47c72 C neumí správně počítat (?)
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    http://www.fastcgi.com/ FastCGI is simple because it is actually CGI with only a few extensions.
    http://www.metalshell.com/source_code/18/Mysql_Select.html How to do a simple connection and select with mysql
    http://xmlsoft.org/ The XML C parser and toolkit of Gnome
    http://curl.haxx.se/libcurl/ libcurl - the multiprotocol file transfer library
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    https://dev.arachne.cz/svn/cll1h SVN/Trac jazyka C<<1 (user-friendly nadstavba nad ANSI C99 - ve stylu JQuery vs. JavaScript)
    Benchmark iterace a serializace stringů v různých jazycích vs. v C
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        moderátor se velice zhruba řídí zvyklostmi moderace, která kdysi platila v řadě konferencí sítě FidoNet ... C != 0xdead */
    rozbalit záhlaví
    XCHAOS
    XCHAOS --- ---
    ANT_39: tak já to chystám přesně jak říkáš - už mám hotovou funkci get_str(), která změří délku všech svých (1 ... n) argumentů, alokuje prostor a nakopíruje do něj obsah stringu (a toto jsem měl mít už dávno a měla by to být podle mě v C norma).

    zdrojem řetězců náhodné délky je vše: stringy přicházející z textových konfiguráků, z databáze, z webových formulářů... string známé délky je naprosto speciální případ a mimo chráněný svět zdrojového kódu programů a počítačových her se prakticky nevyskytuje.
    ANT_39
    ANT_39 --- ---
    XCHAOS: Rekl bych, ze vetsinou vis, jak dlouhe tve retezce budou, a podle toho si alokujes presne tolik mista, kolik potrebujes. Alokovat MAXLEN a pak doufat, ze se to tam vejde, je nerozum. Vyjimkou je urcite pripad, kdy nacitas retezec nezname delky, a delas prubezne realokace, tam bys pomoci nejakeho MAXLEN mohl hlidat, aby ti mamuti retezec nedosnul masinu.
    XCHAOS
    XCHAOS --- ---
    ISTEVE: tak typicky delší životnost než funkce, ve které vznikají, mají "moje" spojové seznamy (viz předchozí flamewar - ale i navzdory argumentům, které zde padly, je to stále moje oblíbená datová struktura...).

    typickým příkladem dočasné alokace jsou pak různé operace na bázi immutable stringů (ve stylu Pythonu), které pokládám za bezpečnější, než "tradiční" stringovou gymnastiku v C (ta je prováděna na stacku, tradičně vázaná na nějaké to "MAXLEN" se kterým je alokován každý string)
    ISTEVE
    ISTEVE --- ---
    DAVIDOWITCH: ...pokud nebude funkce brat ownership toho co je ji predano jako argument, treba proto ze ocekava delsi zivotnost tech dat nez caller (ala multithreadovy aplikace)...

    ...a to s alloca (jak rika janfrog) nemuze vubec, coz je ponekud vetsi omezeni;]
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    XCHAOS: Tak s mallocem tohle stejne udelat nesmis, protoze si zahodil pointer a nezvladas free, zeano...
    XCHAOS
    XCHAOS --- ---
    DAVIDOWITCH: no tak mě v podstatě ne... ale právě třeba moje makro-zápisy často vedly přesně k něčemu podobnému a byl jsem tady za to dost kritizován...
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    XCHAOS: Sorry, ale to ze musim udelat:
    int *foo = alloca(5*sizeof(int));
    bar(foo);

    misto

    bar(alloca(5*sizeof(int)));

    Mi az tak omezujici neprijde. Ale pochopitelne, ymmv
    XCHAOS
    XCHAOS --- ---
    DAVIDOWITCH: jo. já teda používám -std=c99 takže mě asi něco z toho trápit nebude... ale spíš mě jde o to "On many systems alloca() cannot be used inside the list of arguments of a function call, because the stack space reserved by alloca() would appear on the stack in the middle of the space for the function arguments. " - to mě přijde jednak logické, jednak jako vážné omezení.

    kdybych věděl, jak zjistit kolik mi zbývá místa na stacku, tak můžu zavolat set_rlimit() pokaždé, když by další alokace to místo spotřebovala :-) ale co jsem tam googlil, tak zjistit tohle vůbec není triviální.

    můj závěr je, že pro svojí službu bleskové dealokace celého poolu paměti současně nebudu používat alloca() (ani kdyby to náhodou v gcc fungovalo jak očekávám) - i když to automatické uvolnění po návratu z jakékoliv funkce je samozřejmě lákavé.
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    XCHAOS: http://linux.die.net/man/3/alloca
    Myslis to varovani tady?
    XCHAOS
    XCHAOS --- ---
    HARVIE: o to nejde, jestli je to do nekonečna... malloc() má k dispozici v podstatě veškerou momentálně zbývající RAM + velikost swapu k tomu + ještě vypudíš z RAM diskovou cache, než to začne swapovat. velikost stacku je naproti tomu nastavená fixně (a výchozí velikost je zjevně 0.5 MB).
    HARVIE
    HARVIE --- ---
    XCHAOS: Mno... Ani mallocovat se neda do nekonecna zejo...
    XCHAOS
    XCHAOS --- ---
    JANFROG: mě v podstatě jde jen o to napsat si nějaký co nejjednodušší memory pool, u kterého budu plně rozumět tomu, jak funguje - a bude schopen jednoduše hromadně uvolňovat větší množství paměti (i bez použití garbage collection).

    že to nemusí fungovat mimo scope, ve kterém alokuju, to mě nevadí - to je u mě spíš feature, ne bug, konec funkce či scope je pro mě vhodné místo, kde masivně dealokovat (pokud se s tím od začátku počítá) (ostatně garbage collection pomocí reference counteru by taky dealokovala typicky v místě, kde zanikne poslední reference na objekt, což je v řadě případů to samé místo)

    DAVIDOWITCH: no man alloca před tím varuje, tak nevím... podle téhle manuálové stránky se takto alokovaná paměť překrývá ze začátkem stacku z hlediska té volané funkce.
    JANFROG
    JANFROG --- ---
    XCHAOS: alloca() jako princip alokatoru ma dva zasadni problemy
    (i) nemuzes tim alokovat pamet, ktera musi prezit aktivaci funkce, ktera alokuje. Jakmile se ti funkce vrati, data jsou v ... (a nemuzes pouzivat setjmp/longjmp)
    (ii) se zvysovanim limitu stack segmentu budes mit problemy ve vicevlaknovych aplikacich
    (pthreads).

    Jo, a na sbrk() se vykasli, vystacis si s mmap() a mprotect()...
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    XCHAOS: Hmm.. ja uz alloca chvili nepouzival a na linuxu nikdy, ale nevybavuju si ze bych mel nejakej velkej problem s predavanim pameti volanym funkcim. V cem je ten problem?
    XCHAOS
    XCHAOS --- ---
    asi se přiznám, co jsem spáchal tentokrát (zvýrazňovátko si do Debianu nainstalujete pomocí apt-get install highlight - bohužel jsem ale nepřišel na to, jak u téhle konverze zabránit zdvojení řádkování :-) )

    #include <stdio.h>
    #include <alloca.h>
    #include <malloc.h>
    #include <sys/time.h>
    #include <sys/resource.h>

    int main(void)
    {
    int i;
    char *buf;
    struct rlimit r;

    getrlimit(RLIMIT_STACK,&r);
    printf("RLIMIT_STACK soft=%d, hard=%d\n",r.rlim_cur,r.rlim_max);
    r.rlim_cur=20000000;
    setrlimit(RLIMIT_STACK,&r);
    getrlimit(RLIMIT_STACK,&r);
    printf("RLIMIT_STACK soft=%d, hard=%d\n",r.rlim_cur,r.rlim_max);
    printf("%d\n",time(NULL));
    for(i=0;i<500000;i++)
    {
    buf=alloca(2);
    }
    printf("%d\n",time(NULL));
    for(i=0;i<10000000;i++)
    {
    buf=malloc(2);
    }
    printf("%d\n",time(NULL));
    }


    po spuštění to vypíše tohle (cílem bylo mj. zkusit změřit rychlost alokace paměti, která je u malloc() v 64bitovém virtuálním stroji které má přiděleno jedno jádro někdo kolem 10 milionů za sekundu)

    RLIMIT_STACK soft=8388608, hard=-1
    RLIMIT_STACK soft=20000000, hard=-1
    1339660461
    1339660461
    1339660462


    .. takže evidentně s tím stackem lze za chodu hýbat... otázka tedy je, jestli by mělo smysl dělat nějaký wrapper kolem tohoalloca (resp. jak vůbec zjistím, kde momentálně na stacku jsem a jestli si můžu dovolit allocal()).

    stejně si myslím, že jsou důvody to nedělat (viz že by pak nešlo alokovanou paměť přímo předávat volaným funkcím...což se sice nedělá často, ale je to podobně matoucí, jako když makro provede dvojí vyhodnocení výrazu předaného jako parametr, apod.)
    XCHAOS
    XCHAOS --- ---
    V podstatě se obloukem vracím k zavržené anketě [ XCHAOS @ ANSI C/C99 (specifikace), GNU C (gcc, glibc), Tiny C (tcc) a POSIX - ne nutně C++,g++,libstdc++ nebo Win32 API ] kde všichni chtějí být hrozně pokročilí: nedá mi to, ale nemyslím si, že k C může jen tak přijít někdo, kdo se naučil programovat na JavaScriptu, PHP nebo Perlu, a jen tak rutinně ho začít používat s tím, že "místo tamtoho se používá tohle, brnkačka".

    třeba s tím odchytáváním SIGSEGV... jsem fakt zvědav, co si představujete, že jde dál dělat, když vám dojde místo na stacku: kromě nějakého zalogování chyby či nouzového uložení důležitých a přitom dosud neuložených dat toho podle mě moc dělat nejde. resp. kdyby šlo o chybu malloc(), tak má v multitaskovém prostředí cenu zkusit po nějaké době alokovat paměť znovu.... ale u toho alloc

    dobře... ještě je tu volání brk() a sbrk() ... to se přiznám, že je pro mě alchymie :-) hmm....

    setrlimit(RLIMIT_STACK,..) ... tím chcete říct, že když se před každým voláním alloca() zeptám, jestli mám dost místa, že můžu stack případně on-demand zvětšit? tak to snad budu muset zkusit :-)
    XCHAOS
    XCHAOS --- ---
    JANFROG: je tam ještě jedno "ale" - já si chtěl napsat "univerzální" alokátor, který se bude používat všude stejně - ale budu nad ním mít nějaké řídící nástroje (v mém případě flow control makra, ale lze si to představit i "čistší", jako volání nějakých přepínačů), které by řekly, kam se alokuje. no ale protože alloca() je v gccv inlinované, tak to není funkce, na kterou by šlo získat pointer.... a stejně tak to nejde obalit funkcí, právě proto, že to alokuje na stack.

    DAVIDOWITCH: asi ano, ale těch nevýhod je tam více - např. nemůžeš paměť kterou ti alloca() vrátí jednoduše předat v seznamu argumentů volané funkce, čímž se to přesně blíží omezením, za které tady byla krizována moje makra: prostě pro kohokoliv mimo naprostých guru (kteří přesně chápou jak to je v C se stackem... což i mě pár let trvalo) tam čekají obrovské nástrahy.
    JANFROG
    JANFROG --- ---
    XCHAOS: Tak to vychazi z principu alloca(). Vzdycky muzes SEGV chytit, zjistit ze to bylo kvuli tomuhle, zamest pod stul a vratit chybu. Kdyz to budes delat, dej si tam par desitek bytu jako rezervu pro operacni stack handleru te chyby :-)
    PIGSTER
    PIGSTER --- ---
    JACHYMKO: otazka - proc zrovna make? to je jako kdyby si na to chtel pouzit msbuild - pujde to, ale nejak mi neni jasny, co ziskas pouzitim maku proti skriptu v cemkoliv jinym
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    XCHAOS: Predpokladam ze nejak umis zjistit kolik ti zbejva na stacku a muzes tudiz alloca obalit.
    Holt kouzlo alloca je v tom, ze je to fakt superlightweight.
    XCHAOS
    XCHAOS --- ---
    JACHYMKO: buď cp -r a nebo, pokud jsi náročnější, tak si přečti man install. (ale já se přiznám, že jsem ten typ linuxáka, co nedá ani ránu bez Midnight Commanderu :-)
    Kliknutím sem můžete změnit nastavení reklam