我认为我的代码中存在类型不稳定,但我不确定原因。 请考虑以下代码。
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
。
答案 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
的引用似乎都奇迹般地从输出中消失了。我不明白为什么!