実験してみた(実験結果は32bitモード時のもの)
AClean c;
AClean_init(&c, ma1, 0);
ARep(10000) AMemAlc1_alc(ma1, 24, &c);
AMemAlc1_report(ma1, stdout);
AClean_out(&c);
// これだと n=10500 total=448000 になる.
// 32*10000(24*10000由来)+256*500(Cleanの内部データ由来,256バイトで20件登録できる).
// 合計で448000バイト、10500個になる.
// 当然だけど、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=517 total=375040 になる.
// 16k*15(24*10000由来)+256*501(Cleanの内部データ由来,256バイトで20件登録できる。alc24のデストラクタ呼び出しが入っているので合計10001件)+
// 1024*1(alc24の内部管理データ).
// 合計で375040バイト、517個になる.
// 上記と比べると71.25KBも節約できている、これは320000バイト→246784バイトになったので、22.88%の削減といえる.
// 当然だけど、AClean_out()後は0に戻る.