首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >单例数组的魔力从何而来?

单例数组的魔力从何而来?
EN

Stack Overflow用户
提问于 2022-01-14 15:02:14
回答 1查看 177关注 0票数 7

Vector{Missing}Vector{Int}之间的以下区别让我感到惊讶(以积极的方式):

代码语言:javascript
运行
复制
julia> @btime fill(20, 10^7);
  15.980 ms (2 allocations: 76.29 MiB)

julia> @btime fill(missing, 10^7);
  20.603 ns (1 allocation: 80 bytes)

julia> Base.summarysize(fill(20, 10^7))
80000040

julia> Base.summarysize(fill(missing, 10^7))
40

julia> typeof(fill(20, 10^7))
Vector{Int64} (alias for Array{Int64, 1})

julia> typeof(fill(missing, 10^7))
Vector{Missing} (alias for Array{Missing, 1})

考虑到fill(missing, n)不会导致像FillArray这样的优化结构,那么如何实现对单例的优化呢?我想它在某种程度上是自动地从一个零大小的单子上掉出来的,但它是如何产生的呢?

我试着阅读array.cjulia.h,但实际上无法理解足够的细节。也许真正的问题是运行时系统是如何处理单例的.?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-14 15:06:51

基本的答案是对于a = Array(T),Julia总是分配sizeof(T)*length(a)+40字节。因为sizeof(Missing) == 0,这意味着它不分配任何与长度相关的字节。

索引在array.c上进行,相关的行是

代码语言:javascript
运行
复制
jl_value_t *r = undefref_check((jl_datatype_t*)eltype, jl_new_bits(eltype, &((char*)a->data)[i * a->elsize]))

当数组的大小为零时,a->data[i * a->elsize]引用a->data的开头。然而,它的内容是完全不相关的:当eltype有零jl_datatype_size时,jl_new_bits 忽略数据指针。,而是从eltype返回instance字段,这是单例对象。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70712573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档