Maybe you can try Pair{V, Union{Nothing,Vector{V}}}
or a similar named tuple instead of a tuple
julia> Base.allocatedinline(Tuple{Int,Union{Vector{Int},Nothing}})
false
julia> Base.allocatedinline(Pair{Int,Union{Vector{Int},Nothing}})
true
julia> Base.allocatedinline(@NamedTuple{first::Int,second::Union{Vector{Int},Nothing}})
true
julia> sizeof(Pair{Int,Union{Vector{Int},Nothing}})
16
Using a null pointer would mean using an undef field. However, you don’t get inlined allocation with this approach
julia> struct P{K,V}
a::K
b::V
P{K,V}(a, b) where {K,V} = new{K,V}(a,b)
P{K,V}(a) where {K,V} = new{K,V}(a)
end
julia> P{Int,Vector{Int}}(1)
P{Int64, Vector{Int64}}(1, #undef)
julia> Base.allocatedinline(P{Int,Vector{Int}})
false