According to the documentation of StaticArrays.jl, mutable static arrays are implemented as mutable structs and are allocated on the heap even though their sizes are known at compile time. Is Julia’s compiler able to detect cases when it’s safe to allocate on the stack instead? (I suppose this must be possible theoretically, but wonder if this feature has been / will be implemented.)
julia> using StaticArrays, BenchmarkTools julia> if VERSION >= v"1.7.0-beta" @inline exp_fast(x) = Base.Math.exp_impl_fast(x, Val(:ℯ)) else exp_fast(x) = exp(x) end exp_fast (generic function with 1 method) julia> function alloctest(x) y = MVector(x) @inbounds @simd ivdep for i ∈ eachindex(y) y[i] = Base.Math.exp_impl_fast(y[i], Val(:ℯ)) end s = zero(eltype(y)) @fastmath for i ∈ eachindex(y) s += y[i] end s end alloctest (generic function with 1 method) julia> x = @SVector rand(32); julia> @btime alloctest($x) 11.995 ns (0 allocations: 0 bytes) 56.18908775961786
The assembly confirms that
y is in fact stack allocated (loads and stores use
rsp, the 64-bit-mode stack pointer).
Note that in many cases, the
MArray will not be allocated at all, existing only in the CPU’s registers if at all.