2016-07-25 6 views
2

私は以下のようにPerlとCで2つのコードセクションを持っています。これはPerlのmy変数とCの自動変数に関するものです。ある程度は、関数に入るたびに初期化されるという点ではかなり似ています。しかし、Perlはサブルーチンの変数myを参照することができます。戻り値の後に関数呼び出しスタックが破棄されるため、Perlはサブルーチンの変数を参照できます。誰でもこの機能をPerlがどのように実装しているのか知っていますか?それは、すべてのサブルーチンコールスタックをそのままにすることはできませんでした。つまり、Perlは "データセグメント"(スタックと比較して)のサブルーチンに作成された変数myを割り当てますか?Perlはどのようにサブルーチンのプライベート変数へのグローバル参照を実装していますか?

Perlコード:

use strict; 
use warnings; 

my $ref; 

sub func 
{ 
    my $str = "hello"; 
    $ref = \$str; 
} 
func; 
print "value is "; 
print "${$ref}\n"; 

Cコード:

#include <stdio.h> 

int *pi; 

void func(void) 
{ 
    int j = 9; 
    pi = &j; 
} 

int main(void) 
{ 
    func(); 
    printf("value is "); 
    printf("%d\n", *pi); 
    return 0; 
} 

おかげで、あなたが関数内でローカルに作成されたいくつかのデータへ参照にグローバル変数を設定している

答えて

0

Perl(「マネージメモリ」言語)では、すべての参照がなくなるまでガベージコレクションされない参照カウントされた「オブジェクト」(ここでは文字列であるため、ゆるやかな用語を使用します)。

Cでは、これは単なるメモリアドレスであり、有効であることを確認する必要があります(また、関数が返されるとすぐに既に再利用されているスタック領域を指しません)。

+0

こんにちは@Thiloサブルーチンの変数に参照カウントを使用できるようにするには、参照されている場合は、my変数がデータセグメントに格納されますか?参照されていなければスタックに格納されますか? – password636

+0

Perlのすべての変数は、自動スタックではなく、管理されたヒープ領域に割り当てられていると思います。サブルーチンが終了すると、すべてのローカル変数の参照カウントが減少し、別の参照を作成しない限り、通常は0になります。これは、Javaでオブジェクトを使用するようなものです(プリミティブとは異なり、スタックに割り当てられ、Cの例のようになります)。 – Thilo

関連する問題