2016-08-10 11 views
2
for $i (1..1000000) 
{ 
    my $a = rand(10); 
    my $b = rand(10); 
    my $c = rand(10); 
} 

は、上記のコードは、それにより以下のコードよりも多くのメモリを使用して、ループの各反復中$a$b$cための新しいメモリ位置を割り当てますか?forループの変数を宣言するのに悪いですか?

my ($a,$b,$c); 
for $i (1..1000000) 
{ 
    $a = rand(10); 
    $b = rand(10); 
    $c = rand(10); 
} 
+0

悪くないだけでなく、Perlでは、実際に変数を使用する場所に可能な限り近いところに変数を宣言することが実際には望ましいことです。 – ThisSuitIsBlackNot

答えて

5

それはfor my $i (...)する必要がありますので、(まず第一に、$iは、グローバル変数であってはならない。彼らが使用する特殊変数だから第二に、ではなく、さらに例では、名前$a$bを使用していませんsortによる。)

ブロック}の終わりに到達したときに$a$b、および$cが解放されるので、その質問への素朴な答えは、ノーですので、繰り返しの最終的な結果は、メモリの使用でゼロの変化です。

Perlでの実際の実装はさらに賢くです:それはので、それを繰り返し自由に持っているし、メモリの同じ部分を再割り当てしない$a/$b/$cためのメモリを再利用します。 (もちろん、変数がスコープ外にあっても変数が生きているので、ループ本体を越えて持続するローカル変数の1つへの参照を作成すると、そのことはできません)

これにループを変更することにより、それが事実であることを確認することができます

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

出力は、メモリ位置は、すべてのループ反復で同一であることを示している

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) 

のようなものになります。

+0

メモリの場所が同じではないかと少し奇妙なのですか?他のプロセスが次の反復でそれらの場所を占有していないでしょうか? – CJ7

+0

@ CJ7 Perlはメモリを解放しません。つまり、OSに返されず、他のプロセスはそれを使用できません。 [ミニチュートリアル:Perlのメモリ管理](http://www.perlmonks.org/?node_id=803515) – ThisSuitIsBlackNot

+0

@ CJ7 https://en.wikipedia.org/wiki/Virtual_memory - すべてのプロセスには独自のアドレス空間があります。メモリアドレスは、グローバルではなく、プロセスによって異なります。したがって、たとえperlが変数のメモリを解放したとしても、他のプロセスがメモリを使って何をするかは問題ではありません。 – melpomene

関連する問題