but calling malloc_usable_size(malloc(1)) is giving me 24, so it at least allocated 24 bytes for my 1, plus any tracking overhead
Indeed. Padding exists. A bool is still one byte.
it’ll get 3+ extra bytes added on the next fn call.
...of padding. Jesus. Are you going to claim that uint16_t is not 2 bytes because it is sometimes followed by padding?