参数类型的内部构造函数

时间:2015-11-06 18:39:39

标签: julia

我对参数类型的内部构造函数中的类型注释感到有点困惑。

在JIT推理效率和运行时效率方面,以下4种方法有什么不同?

immutable MyType{T}
    x::T
    MyType{T}(x::T) = new{T}(x + x)
end

immutable MyType{T}
    x::T
    MyType(x::T) = new{T}(x + x)
end

immutable MyType{T}
    x::T
    MyType(x::T) = new(x + x)
end

immutable MyType{T}
    x::T
    MyType{T}(x::T) = new(x + x)
end

它们都适用于x = MyType{Int}(1)

2 个答案:

答案 0 :(得分:2)

根据Jeff的回答here

  

问题1:如果类型的名称是X,并且构造函数具有   表单函数X {...}(...)然后右大括号的内容   将X传递给新的。

     

问题2:要创建实例,类型参数必须具有明确性   值,所以new(...)总是等同于一些新的{...}(...)。他们   将降低到完全相同的东西。

他们完全相同。你的最后一个例子是规范模式:

struct MyType{T}
    x::T
    MyType{T}(x::T) = new(x + x)
end

答案 1 :(得分:2)

我使用上述4种方法宣布MyType

immutable MyType1{T}
    x::T
    MyType1{T}(x::T) = new{T}(x + x)
end
immutable MyType2{T}
    x::T
    MyType2(x::T) = new{T}(x + x)
end
immutable MyType3{T}
    x::T
    MyType3{T}(x::T) = new(x + x)
end
immutable MyType4{T}
    x::T
    MyType4(x::T) = new(x + x)
end

然后打印他们的LLVM字节码:code_llvm(MyType1{Int},Int)并比较输出,它们完全相同,所以我认为 4种方法之间没有区别。