Not forcing you to carry around a size is a feature, not a bug - if you don't need the size, it's just a waste of space.
In C, the size of the array is there even if you can't get at it. On the stack, the compiler needs to know how big an array is to know where to put the next variable; on the heap, the runtime needs to know how big the buffer was returned from malloc so it knows how to delete it. You just don't have access to that number.
Real programs don't eat cache.