Vector{Union{T, Missing}} 是 Vector{T} 大小的两倍吗?

هنر*_*تان 6 arrays julia

是正确的还是有问题Base.summarysize

julia> x = rand(Int8, 100);

julia> Base.summarysize(x)
140

julia> x = allowmissing(x);

julia> Base.summarysize(x)
240
Run Code Online (Sandbox Code Playgroud)

Ale*_*207 9

在这种情况下,它为每个元素添加一个字节:

Julia 现在还可以将“isbits Union”值内联存储在数组中,而不需要间接框。通过存储额外的字节“类型标记数组”(每个数组元素一个字节)以及实际数组数据的字节来完成优化。 https://docs.julialang.org/en/v1/devdocs/isbitsunionarrays/

例如,考虑以下情况Int16

julia> x = rand(Int16, 100);

julia> Base.summarysize(x)
240

julia> x = allowmissing(x);

julia> Base.summarysize(x)
340
Run Code Online (Sandbox Code Playgroud)

其中 340 = (2+1)*100 + 40

  • 2字节:大小Int16
  • 1 个字节:额外字节(类型标记)
  • 40 字节:元数据(具有形状、偏移量...),与数组的大小无关

请注意,使用少于一个字节的类型标记将导致元素不再在字节边界对齐。