Normally you would just do
static_topk(x, k) = _topk_static_dispatch(x, Val(k))
rather than PREALLOC_VALS[k].
But in another project I found you can get a tiny performance boost if you create all the Val(i) beforehand and just index it. I didn’t test whether it affects this one though; it’s just a habit (perhaps a bad one).
The ::Val{k} is just to make the function get recompiled each time k changes, so that the static arrays are type stable. (@generated only re-generates the functions when types change, so you couldn’t get around using the Val{k} here).
(I remember reading that in the most recent Julia versions, the compiler tends to be good enough so you don’t need @generated in most scenarios, so you can just let type specialization handle everything.)