実験してみた(実験結果は32bitモード時のもの)
AClean c;
AClean_init(&c, ma1, 0);
ARep(10000) AMemAlc1_alc(ma1, 24, &c);
AMemAlc1_report(ma1, stdout);
AClean_out(&c);
// これだと n=10323 total=402688 になる.
// 32*10000(24*10000由来)+256*323(Cleanの内部データ由来,256バイトで31件登録できる).
// 合計で402688バイト、10323個になる.
// 24*10000を使うために、32*10000が使われたので、効率は75.00%になる.
// 当然だけど、AClean_out()後は0に戻る.
AClean c;
AClean_init(&c, ma1, 0);
AMemAlc0 alc24;
AMemAlc0_init1(&alc24, 24, ma1, 16 * 1024, &c); // ma1から16KBずつとってきて24バイトに切り分けて提供するアロケータを作る.
ARep(10000) AMemAlc0_alc(&alc24, &c);
AMemAlc1_report(ma1, stdout);
AClean_out(&c);
// これだと n=339 total=329472 になる.
// 16k*15(24*10000由来)+256*323(Cleanの内部データ由来,256バイトで31件登録できる)+1k*1(alc24の内部管理データ).
// 合計で329472バイト、339個になる.
// 24*10000のために、16k*15+1K*1が使われたので、効率は97.25%になる.
// 当然だけど、AClean_out()後は0に戻る.