C Devel::Size报告子系统的大小

C Devel::Size报告子系统的大小,c,perl,subroutine,internals,C,Perl,Subroutine,Internals,我刚刚读了Gabor Szabo的文章,他指出Devel::Size报告说一个简单的sub{}需要8516字节的空间。报告的尺寸正确吗?如果是这样,为什么Perl需要为一个空的子例程分配这么多空间 $ perl -MDevel::Size=total_size -E' my $s = "x" x 100_000; my $x = \$s; my $y = \$s; say total_size($x); say total_size($y); ' 100048 10

我刚刚读了Gabor Szabo的文章,他指出Devel::Size报告说一个简单的
sub{}
需要8516字节的空间。报告的尺寸正确吗?如果是这样,为什么Perl需要为一个空的子例程分配这么多空间

$ perl -MDevel::Size=total_size -E'
   my $s = "x" x 100_000;
   my $x = \$s;
   my $y = \$s;
   say total_size($x);
   say total_size($y);
'
100048
100048
这是否意味着
$x
$y
的大小加起来是200KB?不,我也有同样的想法

这不是sub的大小,而是引用的大小,以及它直接或间接引用的所有内容

$ perl -MDevel::Size=total_size -E'
    sub f { }   say total_size(\&f);
    ${"xxx"}=1; say total_size(\&f);
    ${"yyy"}=1; say total_size(\&f);
'
5847
5908
5969

正如您所看到的,这不仅仅是测量子项。似乎有一个指向子项名称空间的指针。

Devel::Size在测量复杂项(如子例程)的大小时没有易于理解的规则

是Devel::Size的一个实验分支,它使用引用计数来决定包含什么,因此结果更容易理解。它还包括可视化数据内部结构的方法


你可以找到更多关于Devel::SizeMe的信息,包括幻灯片和屏幕广播的链接。

记住这一点,我倾向于不相信
Devel::Size
所说的任何比普通数据结构更复杂的东西的大小。(即使是那些,我也会小心。)