大小占用的数量为零

时间:2015-05-20 07:48:23

标签: ruby

我有一个nil数组,比如说

a = [nil,nil,nil]

数组a的大小(以字节为单位)是什么?

我使用ruby 1.9.3p484

我尝试了ObjectSpace.memsize_of()方法,但输出很混乱。

>> a = [nil,nil,nil]
=> [nil, nil, nil]
>> ObjectSpace.memsize_of(a)
=> 0
>> a = [nil,nil,nil,nil]
=> [nil, nil, nil, nil]
>> ObjectSpace.memsize_of(a)
=> 32
>> a = [nil,nil,nil,nil,nil]
=> [nil, nil, nil, nil, nil]
>> ObjectSpace.memsize_of(a)
=> 40

1 个答案:

答案 0 :(得分:1)

将嵌入大小小于或等于RARRAY_EMBED_LEN_MAX(默认为3)的数组,以提高小数组的性能。基本上,一个包含3个项目或更少will not be allocated on the heap的数组。

这解释了您的示例令人困惑的输出。

require 'objspace'
(1..10).to_a.each { |i| p [nil] * i, ObjectSpace.memsize_of([nil] * i) }
[nil]
0
[nil, nil]
0
[nil, nil, nil]
0
[nil, nil, nil, nil]
32
[nil, nil, nil, nil, nil]
40
[nil, nil, nil, nil, nil, nil]
48
[nil, nil, nil, nil, nil, nil, nil]
56
[nil, nil, nil, nil, nil, nil, nil, nil]
64
[nil, nil, nil, nil, nil, nil, nil, nil, nil]
72
[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
80
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

请注意,ObjectSpace.memsize_of(array)只会为您提供数组对象本身的大小,不包括其项目。

相关问题