REDGUY: je to trochu jinak.. právě proto jsem chtěl to flow-control makro forget{ } (jak si zašal prudit, že uvnitř toho není definovaný chování continue a break :-)
v podstatě jsem si představoval, že ty režimy jsou dva - ale spíše jsou tři, a jen jeden z nich je standardní malloc
představ si tyhle vnoření
main { /*alloc=malloc*/ forget { /*alloc=xalloc*/ remember { /*alloc=malloc*/ } } }
vs.
main { /*alloc=malloc*/ forget { /*alloc=xalloc0*/ forget { /*alloc=xalloc1*/ remember { /*alloc=xalloc0 */ } } } }
v podstatě moje myšlenka na promísení forget{ } a remember{ } maker vede ke třem možným stavům (pokud ten top-level očekávaný stav má být malloc) ... a ještě bych to doplnil o nějaké allocate{ } flow control makro, ve kterém by alloc byl vždy malloc().
tím, že nepřepínám kontexty, ale tvrdě hlídám začátek a konec scope je to zejména vhodné ke strukturám typu
forget {void *tmp1r=get_něco(), *tmp1r=get_něco() }
protože se ti naalokovaná paměť na konci místní scope uvolní spolu s definicema těch proměnných, co na ní odkazují. já takto víceméně jednak programovat chci, jednak už vím, jak toho dosáhnu, ovšem jak už jsem citoval Henryho Forda jinde - stěží si vybuduju reputaci na tom, že se to chystám udělat - budu muset jít a udělat to :-) důvod proč jsem to neudělal je prostě ten, že mi některé kombinace nebyly jasné, a že jsem pořád dost tvrdě ignoroval, že jeden z režimů ve kterých se budu chtít pohybovat, by měl natvrdo být "fallback na malloc()" - tedy ta samá moje funkce (postavená na toolkitu) použije malloc() když jí zavolám jen tak z main() bez uvedení další speficikace, ale že naopak použije bleskové memory pooly, když jí zavolám uvnitř svého forget { } scope.
takže zadání pro sebe mám jasné - nepíšu univerzální náhradu malloc(), ale píšu jakési svoje "get_cosi(...)" či "get(cosi,...), které má jako jeden z režimů malloc(): na uvolňované pointery se může free() v případě, že volající ví, co dělá - typicky se free zavolá na nějaké více "vnější" vrstvě programu.
další možnost je definovat dispose(), které si zkontroluje, zda pointer neukazuje dovnitř aktuálního memory poolu - a teprve pokud ne, tak na to zavolat free a pokud ano, tak snižovat nějaký vnitřní counter memory poolu až do té míry, že by např. stránka memory poolu obsahující právě jeden záznam byla ozačená jako volná...
lze si to představit jako trochu sofistikovanější přepínání mezi malloc() a alloca() - s tím, že alloca() není omezené na velikost stacku.
víceméně vám tohle může připadat jako dlouhé a jako blábol - ale pro mě je to naopak zdůvodnění toho, proč se o tom s někým radím online (a musím přetrpět všechen výsměch a flamewary) - protože se víceméně pořád držím své původní koncepce, ale zahrnul jsem do ní některé docela chytré přípomínky, které tu zazněly. a teď bych asi fakt měl sednout a naprogramovat to :-)