Las 'Size classes' son un concepto fundamental en la gestión de memoria, especialmente en asignadores de memoria (memory allocators) como los que operan a nivel de kernel o en entornos de tiempo de ejecución (runtimes). Consisten en un conjunto discreto de rangos de tamaño de memoria predefinidos. En lugar de asignar exactamente el tamaño solicitado, el asignador redondea la solicitud al 'size class' más pequeño que puede acomodarla. Esto permite al asignador mantener 'pools' o 'arenas' de bloques de memoria de tamaño fijo para cada 'size class', simplificando la búsqueda de bloques libres y la coalescencia, y mitigando la fragmentación externa.

Este concepto es ampliamente implementado en sistemas de alto rendimiento y entornos con alta concurrencia. Ejemplos notables incluyen el 'slab allocator' en el kernel de Linux, que utiliza 'size classes' para objetos de kernel de tamaño fijo (como estructuras de datos de procesos o VFS dentry cache). Otros asignadores de memoria de propósito general como jemalloc (utilizado por FreeBSD, Firefox, y Redis) y tcmalloc (utilizado por Google y en el runtime de Go) hacen un uso extensivo de 'size classes' para optimizar la asignación de memoria en aplicaciones de usuario. Estos asignadores suelen tener una serie de 'size classes' pequeñas para objetos frecuentes y luego saltos más grandes para solicitudes de memoria mayores.

Para un arquitecto de sistemas, entender las 'Size classes' es crucial para diseñar sistemas eficientes y predecibles. La elección de un asignador de memoria y su configuración de 'size classes' puede tener un impacto significativo en el rendimiento, el consumo de memoria y la latencia. Un diseño deficiente puede llevar a una fragmentación excesiva, un mayor uso de memoria (debido al 'internal fragmentation' dentro de cada 'size class') o cuellos de botella en la asignación/liberación. Al diseñar sistemas que manejan muchos objetos de tamaño similar, como caches o pools de conexiones, un arquitecto puede influir en la eficiencia del asignador eligiendo tamaños que se alineen bien con las 'size classes' subyacentes, o incluso diseñando sus propios 'custom allocators' para cargas de trabajo muy específicas. Es un 'trade-off' entre la simplicidad de la gestión, la fragmentación interna y externa, y el rendimiento de las operaciones de asignación.