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

는 위의 코드하여 다음 코드보다 더 많은 메모리를 사용하여 루프의 각 반복하는 동안 $a, $b$c 새로운 메모리 위치를 할당 할 것인가? 그 for my $i (...)을해야하므로for 루프에서 변수를 선언하는 데 문제가 있습니까?

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

나쁜 것은 아니지만 Perl에서는 가능한 한 변수를 사용하는 곳 가까이에 변수를 선언하는 것이 실제로 바람직합니다. – ThisSuitIsBlackNot

답변

5

(첫째는, $i는 전역 변수 안된다. 둘째, 심지어 예에서 이름 $a$b를 사용하지 마십시오, 그들이 사용하는 특수 변수이기 때문에 sort 의해).

블록 }의 끝에 도달 할 때 $a, $b$c이 해제되기 때문에 그 질문에 대한 순 대답은 아니오하므로 반복의 최종 결과는 메모리 사용에 제로 변화이다.

펄의 실제 구현

도 똑똑하다 : 그것은 그래서 반복적으로 무료로하지 않습니다 다음 동일한 메모리 부분을 재 할당 $a/ $b/ $c의 메모리를 재사용합니다. 물론 변수가 범위를 벗어나지 만 변수가 계속 살아 있기 때문에 루프 본문을 넘어서는 지역 변수 중 하나에 대한 참조를 만들면이를 수행 할 수 없습니다.

이것에 루프를 변경하는 경우가 발생 확인할 수

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에 다시 제공되지 않고 다른 프로세스가 사용할 수 없다는 것을 의미합니다. [미니 튜토리얼 : 펄의 메모리 관리] (http://www.perlmonks.org/?node_id=803515) – ThisSuitIsBlackNot

+0

@ CJ7 https://en.wikipedia.org/wiki/Virtual_memory - 모든 프로세스는 자체 주소 공간을 가지고 있습니다 . 메모리 주소는 전역이 아닌 일부 프로세스와 관련이 있습니다. 따라서 perl이 변수에 대한 메모리를 해제하더라도 다른 프로세스가 메모리를 사용하여 수행하는 작업은 중요하지 않습니다. – melpomene

관련 문제