我对参数类型的内部构造函数中的类型注释感到有点困惑。
在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)
答案 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种方法之间没有区别。