malloc() izdala vairāk atmiņas nekā tam tiek prasīts. Viena daļa no šiem baitiem tiek lietoti saimniecības uzturēšanai un otra ir “noapaļojums” līdz kādam skaitlim, kas dalās ar 2 vai citu autoriem patīkamu skaitli. Vairākumam programmētāju tas nav nekāds jaunums. Bet cik liels ir virstēriņš? Kādu laiku atpakaļ, spēlējoties ar malloc(), es uzzināju, ka glibc reālo izdalītās atmiņas izmēru glabā 4 vai 8 baitos, kas atrodas pirms malloc() atgrieztā atmiņas gabala. Slikts, bīstams, no platformas atkarīgs kods, kas parāda reālos skaitļus:
for (size_t size = 3; size < 100; size += 10) {
void *foo = malloc(size);
size_t real_size = *((size_t *)foo - 1);
printf("requested: %d, got: %d\n", size, real_size);
free(foo);
}
Nu un? Vakar vakarā paskatījos pāris GNOME programmas un izrādījās, ka virstēriņš simbolu virknēm ir pat 60% (statistika uz 500 un vairāk virknēm). Vietām šie procenti ir pietiekoši daudz, lai kaut ko darītu: viens no iespējamiem risinājumiem - GStringChunk. Būs ko darīt brīvdienās.
Update: virstēriņš laikam nekad nav lielāks par 12 baitiem, vismaz glibc uz x86, tāpēc virstēriņš lielākiem atmiņas blokiem būs relatīvi niecīgs.
