SVector{N,T}的N作为结构体的参数类型

我有这么一个数据结构

struct Term{N}
    comps::SVector{N, <:Integer}
end

这是不是一个不好的参数类型设计?因为comps把整个Term类型变得不稳定了。

一个具体案例:

struct Conjunction{O<:Temporal,N} <: Compound
    comps::SVector{N,<:Term}
end

const ConjF = Conjunction{Forward}
const ConjP = Conjunction{Parallel}

function setcondition(cond, i, v)
    @nospecialize cond v
    @match (cond, v) begin
        (::ConjF, ::ConjF) || (::ConjP, ::ConjP) => begin
            constructorof(typeof(cond))([cond[1:i-1]..., v.comps..., cond[i+1:end]...])
        end
        _ => constructorof(typeof(cond))([cond[1:i-1]..., v, cond[i+1:end]...])
    end
end

REPL里运行

julia> c1 = Conjunction{Forward}([Word(:A), Word(:B)])
"(&/,A,B)"

julia> c2 = Conjunction{Forward}([Word(:C), Word(:D)])
"(&/,C,D)"

julia> Junars.setcondition(c1, 1, c2)
"(&/,C,D,B)"

julia> @code_warntype Junars.setcondition(c1, 1, c2)
MethodInstance for Junars.setcondition(::Conjunction{Forward, 2}, ::Int64, ::Conjunction{Forward, 2})
  from setcondition(cond, i, v) in Junars at D:\codes\Junars.jl\src\rules\conditional.jl:121
Arguments
  #self#::Core.Const(Junars.setcondition)
  cond::Conjunction{Forward, 2}
  i::Int64
  v::Conjunction{Forward, 2}
Locals
  355::Union{}
  354::Union{}
  353::Conjunction{Forward, 2}
  352::Conjunction{Forward, 2}
  351::Tuple{Conjunction{Forward, 2}, Conjunction{Forward, 2}}
  return#349::Union{Nothing, Conjunction{Forward}}
Body::Conjunction{Forward}  # Red!!!

最后的结果当然是类型不稳定的,标红了。

我是想利用SVector固定数组大小,想着或许可以减少GC时间之类的。如果把comps的类型换成Vector{<:Term}的话,好处是运行时间减少一半,快了二十微秒吧,以及类型稳定。

感觉用Vector的这个「类型稳定」说得有些牵强
如果没有特殊需求的话,为什么不用

struct Term{N, T<:Integer}
    comps::SVector{N, T}
end

这个算是我的设计失误了,既然执行前不晓得长度,就不应该用SVector

备案号:京ICP备17009874号-2