Julia中奇数维度与偶数维度Vector的内存分配差异
为什么Julia初始化Vector时奇数长度不会额外分配内存?
先看你提供的代码运行结果:
julia> for N in 1:10 @time a = [k for k in 1:N] end 0.000002 seconds (1 allocation: 64 bytes) 0.000000 seconds (1 allocation: 80 bytes) 0.000000 seconds (1 allocation: 80 bytes) 0.000000 seconds (1 allocation: 96 bytes) 0.000000 seconds (1 allocation: 96 bytes) 0.000000 seconds (1 allocation: 112 bytes) 0.000000 seconds (1 allocation: 112 bytes) 0.000000 seconds (1 allocation: 128 bytes) 0.000000 seconds (1 allocation: 128 bytes) 0.000000 seconds (1 allocation: 144 bytes)
这个现象和Julia对奇数长度的特殊优化无关,其实是内存分配器的块大小策略在起作用:
- Julia默认用jemalloc做内存分配器,它处理小内存请求时,会按固定递增的块大小来分配(比如64、80、96、112字节这类,每步涨16字节),不会精确分配你刚好需要的字节数——这么做是为了减少内存碎片,同时保证内存对齐。
- 对于存储
Int64元素的Vector来说,每个元素占8字节,再加上数组自身的元数据、分配器的头部开销,总内存需求会呈现这样的规律:- N=1时,总需求刚好凑齐64字节的块,所以分配64字节。
- N=2时,总需求超过了64字节,但还没到80字节,分配器直接给下一个80字节的块;到N=3时,总需求刚好填满80字节的块,所以和N=2用了一样的内存。
- 以此类推,N=4的需求超了80字节,分配96字节的块;N=5的需求刚好填满96字节,所以和N=4的分配大小相同。
说白了,不是奇数长度没额外分配,而是奇数长度的总内存需求刚好卡准了分配器的块大小,相邻的偶数长度需求还没填满这个块,所以两者看起来用了一样的内存。
内容的提问来源于stack exchange,提问作者CrisPlusPlus
相关产品推荐
相关产品推荐

