Why is runtime.KeepAlive or a package-level sink variable often used to assign the result inside a benchmark loop?var sink int func BenchmarkFn(b *testing.B) { for i := 0; i < b.N; i++ { sink = expensive(i) } }