Out of curiosity, why do we use view(A, :, :, dim)
instead of View(A)[:, :, dim]
? It seems like much of the motivation for the @view
macro is to allow the begin
and end
keywords which are valid in []
square brackets, but if we simply had an indexable type we get those back.
Playing around, it seems like this should be doable:
struct View{A<:AbstractArray} a::A end
Base.getindex(v::View, args...) = view(v.a, args...)
Base.axes(v::View, args...) = axes(v.a, args...)
View(A)[:, :, end] # this just works
Applying it here:
julia> function foo6!(A,B,C,dim)
mul!(View(C)[:,:,dim], View(A)[:,:,dim], B)
nothing
end
foo6! (generic function with 1 method)
julia> @btime foo6!(A,B,C,1)
330.808 ns (0 allocations: 0 bytes)