Perl 在for循环中声明变量不好?

Perl 在for循环中声明变量不好?,perl,memory-leaks,declaration,Perl,Memory Leaks,Declaration,上述代码是否会在循环的每次迭代期间为$a、$b和$c分配新的内存位置,从而比下面的代码占用更多内存 for $i (1..1000000) { my $a = rand(10); my $b = rand(10); my $c = rand(10); } (首先,$i不应该是全局变量,因此我的$i(…)应该是。其次,不要使用名称$a和$b,即使在示例中也不要,因为它们是由使用的特殊变量。) 这个问题的简单答案是否定的,因为$a、$b和$c在到达块的末尾}时被释放,因此迭

上述代码是否会在循环的每次迭代期间为
$a
$b
$c
分配新的内存位置,从而比下面的代码占用更多内存

for $i (1..1000000)
{
    my $a = rand(10);
    my $b = rand(10);
    my $c = rand(10);
}
(首先,
$i
不应该是全局变量,因此我的$i(…)应该是
。其次,不要使用名称
$a
$b
,即使在示例中也不要,因为它们是由使用的特殊变量。)

这个问题的简单答案是否定的,因为
$a
$b
$c
在到达块的末尾
}
时被释放,因此迭代的净结果是内存使用的零变化

perl中的实际实现更为智能:它将内存重新用于
$a
/
$b
/
$c
,因此它不必反复释放然后重新分配同一块内存。(当然,如果您创建一个对循环体之外的某个局部变量的引用,它就无法做到这一点,因为即使该变量的名称已超出范围,该变量仍保持活动状态。)

您可以通过将循环更改为以下内容来确认情况:

my ($a,$b,$c);
for $i (1..1000000)
{
    $a = rand(10);
    $b = rand(10);
    $c = rand(10);
}
输出将类似于

for my $i (1 .. 5) {
    my $x = rand 10;
    my $y = rand 10;
    my $z = rand 10;
    print join(" ", \$x, \$y, \$z), "\n";
}

这表明所有循环迭代中的内存位置都是相同的。

这不仅不错,而且在Perl中,实际上更倾向于声明尽可能接近使用它们的位置的变量。内存位置相同不是有点奇怪吗?在下一次迭代中,其他进程不会占用这些位置吗?@CJ7 Perl不会释放内存,这意味着它不会返回给操作系统,其他进程无法使用它。请参阅@CJ7-每个进程都有自己的地址空间。内存地址是相对于某些进程的,而不是全局的。因此,即使perl释放了变量的内存(它没有),其他进程对它们的内存做什么都无关紧要。
SCALAR(0x4a5788) SCALAR(0x4a5728) SCALAR(0x4a56c8)
SCALAR(0x4a5788) SCALAR(0x4a5728) SCALAR(0x4a56c8)
SCALAR(0x4a5788) SCALAR(0x4a5728) SCALAR(0x4a56c8)
SCALAR(0x4a5788) SCALAR(0x4a5728) SCALAR(0x4a56c8)
SCALAR(0x4a5788) SCALAR(0x4a5728) SCALAR(0x4a56c8)