I think most languages hide this by default because 99% of people don’t have to deal with it.
Zig doesn't have those, so you're forced to use these ad-hoc struct instances.
The zig allocators used to use this because it enabled allocator interfaces without type erasure, but it was found to have a minor but real performance penalty as it is impossible for any compiler to optimize for this in scenarios that are useful for allocators.
Other interfaces might actually have the opposite performance preference