1

%dataを使用しています。大丈夫か、$data={};に切り替える必要があります。?

#!/usr/bin/perl -wT
use strict;
use JSON;

sub makeJson {
        my %data;

        $data{kib} = 1;
        $data{games} = {
                0 => [],
                1 => [qw(a b c d e)],
        };

        return \%data;
}

my $x = makeJson();
print encode_json($x) . "\n";

私は混乱しているので -

makeJson()が数回呼び出された場合- そしてmy %data; スタックに割り当てられ、そのアドレスが返されます-それはメモリリークではないでしょうか、それとも「リーク」ではなく「問題」でしょうか? スタックにメモリが割り当てられているため、まだ参照されているため、割り当てを解除することはできません。

他の方法: ハッシュ参照を返すサブルーチンがある場合は、%data;を使用することをお勧めします。(コンパイラによって事前に割り当てられているため、高速ですか?)または私の $data={}; ?

4

2 に答える 2

0

PerlはCではありません。

それがあなたの質問に対する実際の答えですが、少し拡張します。

Perlには自動変数がないという点で、PerlはCではありません。字句変数と動的変数があり、それだけです。

Perlはメモリ管理を行うという点でCではないので、(ほとんどの場合)そうする必要はありません。循環参照がない場合、メモリリークは発生しません。

Perlは、インタプリタ言語であるためのコストがほとんどのパフォーマンス計算を支配するという点でCではありません。したがって、ハッシュとハッシュ参照のマイクロ最適化はほとんどの場合無関係です。

より自然にあなたの意図を表現する構成を使用してください。どちらも他よりも多くのメモリをリークしません。Amdahlは、パフォーマンスのわずかな違いについて心配することができます。PerlはCではありません。

于 2012-02-28T19:16:11.690 に答える
0

Perl (および他の多くのインタープリター言語) には、コンパイル済み言語のようなスタックの概念がありません。代わりにスコープ規則があります。したがって、Perl はメモリ リークが発生しないことを保証できます。

実際、同じスタックの概念を持っていたとしても、無効になるアドレスを返すだけです。

于 2012-02-26T11:24:49.267 に答える