• ú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
    ANT_39
    ANT_39 --- ---
    XCHAOS: Jestli ti nevadi zaviset na GNU rozsirenich, tak asprintf je jako sprintf, ale buffer si alokuje sam na halde, a pak do nej retezec nakopiruje. Konkatenace by pak byla proste asprintf(&buf, "%s%s%s%s", str1, str2, str3, str4);
    XCHAOS
    XCHAOS --- ---
    REDGUY: připomínky jsou to dobré. odpovím ti stručně (přeci jen je neděle) na tvoje první dvě otázky:

    - alokátor má být určen především pro mě (a dále pro lidi, co se mnou budou chtít spolupracovat)
    - alokátor bude použit ve všech příštích userspace aplikacích, které plánuji v C vyvíjet

    je to podle mě dostačující vysvětlení, které má právo uvést kdokoliv u všech svých dalších dotazů na jakouliv feature jazyka C, kterou v tomhle klubu vznese. Doufám, že je to nyní jasné - a další debata o tom "pro koho a proč" je podle mě v tomhle klubu offtopic. budeme se zde bavit o naprosté jakékoliv (jakkoliv technicky nesmyslné) feature jazyka C - včetně hledání všemožných bezpečnostních děr typu buffer overrun a stack insertion i debat, jak jim zamezit - a nebudeme se prosím bavit proč by toto někdo chtěl zneužít nebo se proti tomu bránit.

    prostě mě zajímá průzkum co nejširší možné množiny programátorských technik, které se týkají čistého jazyka C (a to konkrétně na úrovni předposlední specifikace C99, která mi vyhovuje více, než předchozí norma C89, na které jsem vyrůstal) - a nebudeme ztrácet čas debatami, kdo a proč by mohl chtít něco takového dělat (případná snaha o účast v "C obfuscated code contest" je dostatečný argument, kterým lze argumentovat na zcela jakoukoliv námitku)
    XCHAOS
    XCHAOS --- ---
    ANT_39: ano, tak já už nějaký čas vím, že bych takto měl se stringy pracovat. moje starší programy to ale obchází, a trapně používají buď MAXLEN buffery na stacku (a nebo MAXLEN alokují). právě že směřuji k tomu, že moje novější C aplikace budou používat vlastní mini-knihovnu se základní funkcí na řetězení a současnou alokaci stringů a jejich následnou efektivní masivní dealokaci (obdoba operátoru + v Pythonu či JavaScriptu nebo operátoru . v PHP)
    REDGUY
    REDGUY --- ---
    A hle, stejne jako Zombie Jesus, po trech dnech vstavam z banu a jsem zpet 8)

    Nejdriv troska offtopic, coz?
    XCHAOS: moderátor občas musí holt poněkud offtopic komentovat počíná ostatních Coz by bylo dobre zduvodneni, kdyby ty tvoje off-topic prispevky byly skutecne moderovani, a nikoliv mentalni masturbace nad vlastni kreativitou, nesmyslne obvinovani oponenta z chybne argumentace, podsouvani oponentovi neceho, co nikdy nerekl nebo blaboleni o smyslu zivota Kdybys skutecne jen moderoval, tak ano, mas pravdu. Coz jsi ovsem nedelal. A pokud off-topicujes uplne stejne jako ja, tak kdyz potom vytahnes moderatoske kladivo, je to proste jen zbabelost (a rekneme "neuprimnost", pokud to vydavas za moderovani). Jen tak do zaznamu 8)

    No, ted ale neco k veci, coz?

    Zakladni vec ktera v cele tehle dbate chybi, je kdyz uz ne analyza, tak aspon zduvodneni:

    - Pro koho ma byt xallokator urcen?
    - Pro co je to urceno?
    - Ma to byt nahrada nebo doplnek stavajicich zpusobu alokace pameti?
    - V cem jsou soucasne zpusoby alokace pameti nedostacne a proc?
    - V cem (a jak moc) chces byt lepsi?
    - Jak dobre to ma fungovat s jinejma knihovnama?
    - Jak to celkove koncepcne zapadne do celeho jazyka?

    Chapu ze kdyz si takhle aspon trochu nadefinujeme co vlastne delame, tak se pozdeji bude mnohem hur vyhybat pripadnym namitkam pomoci ukroku stranou, ale toho uz jsme si driv uzili dost, ne?


    XCHAOS: "tradiční" stringovou gymnastiku v C (ta je prováděna na stacku, tradičně vázaná na nějaké to "MAXLEN" - ne, neni. Ze to tak delas ty neznamena, ze to je obecna tradice.

    A btw, dival ses jak funguje alokace pameti v Objective C, jak uz jsem ti nekolikrat doporucoval? Docela by me to zajimalo - kdyz mi vycitas off-topic prispevky, rad bych vedel jaky efekt maji ty on-topic 8)
    ANT_39
    ANT_39 --- ---
    XCHAOS: Ano, co ti chodi zvenku. Uvnitr programu si to zmeris. MAXLEN nepotrebujes.
    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.
    MYSHAAK
    MYSHAAK --- ---
    Prosím o pomoc, dokázal by někdo z vás zkompilovat toto pod Windows? https://github.com/spekode/sskey, zkoušel jsem CygWin, MinGW, ale nedaří se mi :(
    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?
    Kliknutím sem můžete změnit nastavení reklam