两种在Julia中初始化空向量的等效方法

5
在Julia中,使用Vector{Type}()Type[]表达式来初始化一个空的Type向量是完全等价的吗?这两种语法哪种更受青睐?

2
我认为后者更具有“现场定义”的语法,而前者更具有编程性质。这个特定的例子会得到相同的结果,但考虑一下Vector{Int64}(a)的情况:对于a=0,这是一个空向量,但对于任何其他的a,它都是一个初始化了垃圾值的向量。 - Tasos Papastylianou
1个回答

9

是的,它们实际上是完全相同的:

julia> @code_typed Vector{Any}()
CodeInfo(:(begin
        return $(Expr(:foreigncall, :(:jl_alloc_array_1d), Array{Any,1}, svec(Any, Int64), Array{Any,1}, 0, 0, 0))
    end))=>Array{Any,1}

julia> @code_typed Any[]
CodeInfo(:(begin
        return $(Expr(:foreigncall, :(:jl_alloc_array_1d), Array{Any,1}, svec(Any, Int64), Array{Any,1}, 0, 0, 0))
    end))=>Array{Any,1}
Type[] 语法实际上与所有其他 x[] 语法一样,它会扩展为 getindex(Type)。而且你可以在这里看到,它是基于 Array 构造函数定义的。这只是一种方便的缩写。 我不知道有哪些风格指南更喜欢其中之一。

请注意,目前使用 T[] 存在至少一个问题:请参阅 https://discourse.julialang.org/t/performance-issue-with-use-of-eltype/5764 和 https://github.com/JuliaLang/julia/issues/23618 以获取更多详细信息。 - sbromberger
这只涉及到数组推导 - 而不是空向量初始化。 - mbauman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接