dot*_*dot 3 struct tuples julia
如何使用特定类型的空元组初始化可变结构?
例如给定
mutable struct myStruct
info::Tuple{Int, Int}
end
Run Code Online (Sandbox Code Playgroud)
我将如何创建一个变量x = myStruct(info = ())
x.info
空元组在哪里?typeof(x.info) = Tuple{Int, Int}
简而言之,您不能创建类型为空的元组Tuple{Int,Int}
。根据定义,aTuple{Int, Int}
的长度为 2,因此不为空。
将此与Array{Int}
长度为 0 的空值进行比较,因此为空:
julia> empty_array = Int[]
Int64[]
julia> isempty(empty_array)
true
julia> length(empty_array)
0
Run Code Online (Sandbox Code Playgroud)
长答案是这取决于你所说的“空”是什么意思。也许您的意思是不需要初始化的东西。我们可以使用Ref
. 在这种情况下,这些值将是内存中驻留的任何值。总的来说,我不确定这与仅将元组初始化为 相比有什么优势(0,0)
。
julia> r = Ref{Tuple{Int,Int}}()
Base.RefValue{Tuple{Int64, Int64}}((2, 139735268818544))
julia> r = Ref{Tuple{Int,Int}}()
Base.RefValue{Tuple{Int64, Int64}}((139735268745904, 139735268746800))
julia> isempty(r[])
false
Run Code Online (Sandbox Code Playgroud)
总的来说,我不清楚为什么你想要一个空元组而不是作为默认myStruct
构造函数的默认初始值。
对于默认构造函数,我建议使用(0,0)
以下值作为初始值:
julia> mutable struct myStruct
info::Tuple{Int, Int}
end
julia> myStruct() = myStruct((0,0))
myStruct
julia> myStruct()
myStruct((0, 0))
Run Code Online (Sandbox Code Playgroud)
我对为什么你可能想要一个“空”元组的最后一个猜测是为了避免分配。创建myStruct
实例会分配 32 字节。为了避免分配,最好的做法是使结构不可变。这样做有很多优点,例如简化的内存布局涉及更少的指针间接。它还允许编译器做出简化的假设,从而产生更快的代码。
julia> @time myStruct();
0.000001 seconds (1 allocation: 32 bytes)
julia> struct NonAllocatingStruct
info::Tuple{Int, Int}
end
julia> NonAllocatingStruct() = NonAllocatingStruct((0,0))
NonAllocatingStruct
julia> @time NonAllocatingStruct()
0.000002 seconds
NonAllocatingStruct((0, 0))
Run Code Online (Sandbox Code Playgroud)