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.)