Types Julia函数中的意外型不稳定性

Types Julia函数中的意外型不稳定性,types,julia,type-inference,Types,Julia,Type Inference,我想我的代码中有一个类型不稳定,但我不知道为什么。 考虑下面的代码。 module test mutable struct Data arr::Array{Int64, 1} Data(n) = new(zeros(n)) end function main() data = Data(5) data.arr end println(main()) @code_warntype m

我想我的代码中有一个类型不稳定,但我不知道为什么。 考虑下面的代码。

module test
    mutable struct Data
        arr::Array{Int64, 1}
        Data(n) = new(zeros(n))
    end

    function main()
        data = Data(5)
        data.arr
    end

    println(main())
    @code_warntype main()
end
@code\u warntype main()
的输出从以下三行开始

Variables:
  #self#::test.#main
  data::Any
        ^^^

可能我没有正确解释
@code\u warntype
的输出,但似乎
数据
变量的类型不稳定。有人能解释一下这里发生了什么吗?如果有帮助的话,我正在使用
0.6.2

这不是一个真正的答案,但它可能会对这个问题有所帮助。如果我将您的代码重写为二维数组,所有类型的不稳定性似乎都会消失,并且本机代码会最小化:

module test
    mutable struct Data
        arr::Array{Int64,2}
        Data(n::Int64, m::Int64=1) = new(zeros(Int64, n, m))
    end

    function main()
        data = Data(5)
        data.arr
    end

    println(main())
    @code_warntype main()
end
这种情况下的完整输出如下所示:

[0; 0; 0; 0; 0]
Variables:
  #self# <optimized out>
  data::test.Data

Body:
  begin 
      data::test.Data = $(Expr(:invoke, MethodInstance for test.Data(::Int64, ::Int64), :(test.Data), 5, 1)) # line 37:
      return (Core.getfield)(data::test.Data, :arr)::Array{Int64,2}
  end::Array{Int64,2}
[0;0;0;0;0]
变量:
#自我#
data::test.data
正文:
开始
data::test.data=$(Expr(:invoke,test.data的MethodInstance(::Int64,::Int64),:(test.data),5,1))#第37行:
return(Core.getfield)(data::test.data,:arr)::数组{Int64,2}
end::数组{Int64,2}

所有对
Any
的引用现在似乎都奇迹般地从输出中消失了。我不知道为什么

我不能在我的机器上复制,我也不能复制。我的输出以
变量开始:#self#data
。但是,主体包含对
Array{Float64,1}
的引用,我可以使用
Data(n)=new(zeros(Int64,n))
清除这些引用。这也减少了本机代码的长度(
@code\u native
)。仍然有对svec(Any,Int64)的引用,但您需要比我更聪明的人来告诉您这意味着什么!初始化
Data
的一种更为儒略的方法是定义一个外部构造函数
Data(n::Integer)=Data(zero(n))
@woggy您能提供真实代码的
@code\u warntype
的整个诊断输出吗?如果它太长,你可以选择一些红色标记的行。奇怪的是,如果我将原始代码重写为二维数组(见下面的答案),所有类型的不稳定性似乎都消失了!我可能做了一些非常愚蠢的事情,所以我在等待落选的选票-(