Julia函数中出现意外的类型不稳定

时间:2018-04-22 11:24:33

标签: types julia type-inference

我认为我的代码中存在类型不稳定,但我不确定原因。 请考虑以下代码。

select * from property_master
where code='1'
OR (request_type=1 AND code <> '2')

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_warntype main()

也许我没有正确解释Variables: #self#::test.#main data::Any ^^^ 的输出,但似乎我对@code_warntype变量有类型不稳定性。有人可以了解这里发生的事情吗?如果有帮助,我会使用data

1 个答案:

答案 0 :(得分:1)

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

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}

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