3

これは簡単な質問のように思えますが、スクリプト言語で変数を再利用することは一般的に良い考えですか?

私はそれが良い習慣である/そうでない理由に特に興味があります.

たとえば$i、ループ内で繰り返し処理するために使用される最も一般的な変数の 1 つです。

例 (php):

//This script will iterate each entry in $array 
//and output it with a comma if it isn't the last item.

$i=0;    //Recycling $i

foreach ($array as $v) {
    $i++;

    if ($i<count($array))
    {
        echo $v.', ';
    }
    else {
        echo $v;
    }
}

スクリプトにいくつかのループがあるとします。再利用する$iか、 などの別の変数を使用する方がよいでしょう$aか。他のループは from から$bに移動し$zます。

明らかに を再利用するには、ループの前にor$iを設定する必要があります。そうしないと、スクリプトの後半で非常に奇妙な動作が発生します。それを再利用することは面倒な価値があるかどうか疑問に思います..$i=0;null

以下は、別の変数を使用するよりも多くのスペースを占有しますか?

$i=0;    //Recycling $i

もちろん、これは最も単純な使用例であり、スクリプトが非常に複雑である場合は、必要以上に問題が発生するかどうかを知りたいです。

変数を再利用すると、ごくわずかな量のメモリを節約できることはわかっていますが、それらの変数が積み重なると、重要になりますね。

事前に率直な回答をいただきありがとうございます。この質問が漠然としすぎている場合は、お詫び申し上げます。そのことも知りたいので、他の場所でこのような質問をする必要があることを知っています。

4

5 に答える 5

2

「文字列」と「変数」を混同していると思います。文字列は、プログラミング言語に応じて、ASCII または Unicode 文字のコレクションです。変数は、メモリ内の名前付きの場所です。つまり、文字列ではなく、変数のリサイクルについて話しているのです。

残念ながら、変数が処理される方法は、言語とコンパイラによって大きく異なります。詳細を教えていただけると、より良い情報を得ることができます。

ほとんどの言語にはスコープの概念があり、変数領域は宣言時に割り当てられ、スコープが終了すると解放されます。変数を適切なスコープに保持すると、変数は不要になったときに割り当てが解除されるため、メモリの無駄遣いを心配する必要はありません。繰り返しますが、スコープの詳細は言語に依存します。

一般に、そのような変数名を再利用することはお勧めできません。変数を同じスコープ内の初期値にリセットするのを忘れた場合 (そうでない場合) は、実行時にプログラムが壊れてしまうからです。

于 2010-11-15T19:00:11.510 に答える
2

foreach ループに入る前に 0 に初期化する必要があります$i。これは、関数の前半で使用したかどうか、および使用している言語に関係なくです。これは単純に、言語に依存しないベスト プラクティスです。

多くの言語は、カウント変数を for ループのスコープにバインドできるようにすることで、これを強制するのに役立ちます。配列が 0 ベースで数値キーのみを含む場合、 PHPforeachは同様のメカニズムを提供します。

foreach ($array as $i => $v) {
    echo $v;

    if ($i + 1 < count($array))
        echo ', ';
}

また、あなたの声明に関して:

変数を再利用すると、ごくわずかな量のメモリを節約できることはわかっていますが、それらの変数が積み重なると、重要になりますね。

いいえ、そうではありません。変数は、スコープ外になるとガベージ コレクションされます。単一の関数の過程で非常に多くのカウント/一時変数を使用して、メモリ使用量がまったく重要になることは (プログラムでコードを生成しない限り) 事実上不可能です。新しい変数を宣言する代わりに変数を再利用しても、プログラムのパフォーマンスに測定可能な影響はなく、メモリ フットプリントにも実質的に影響はありません。

于 2010-11-15T19:02:31.750 に答える
1

個人的には、インデックス/カウンター変数の再利用に問題はありません.Netなどの一部の言語では、forループで変数を使用すると、変数がそのループに限定されますが、その後何があってもクリーンアップされます。

重要なデータを含む変数を再利用しないでください (すべての変数にはわかりやすい名前を付ける必要があるため、これは問題になりません)。

私はかつて、ある学生が書いた Excel マクロ コードをクリーンアップしようとしなければなりませんでした。すべての変数名はギリシャの神々であり、使用法はスクリプト全体で繰り返し交換されていました。結局、書き直しました。

また、変数のタイプと使用している言語によっては、コンテンツの再割り当てが新しい変数の作成と同じくらい高くつく可能性があることにも注意してください。たとえば、.Net では、文字列は不変なので、これは...

Dim MyString as String = "Something"
MyString = "SomethingElse"

実際には、2 番目の使用量を格納するために新しいメモリ領域を割り当て、MyStringポインターを新しい場所を指すように変更します。

ちなみに、これが以下が本当に非効率的である理由です(少なくとも.Netでは):

Dim SomeString = SomeVariable & " " & SomeOtherVariable

これにより、メモリがSomeVariableさらにメモリに割り当てられSomeVariable + " "、さらにメモリが割り当てられます。SomeVariable + " " + SomeOtherVariable意味SomeVariableは、実際にはメモリに3回書き込まれます。

要約すると、再利用するループ用の非常に単純な変数です。それ以外の場合は、新しい変数を割り当てるだけです。特に、メモリ割り当ては通常、ほとんどのアプリケーションの時間/処理のごく一部に過ぎないためです。

覚えておいてください:時期尚早の最適化は諸悪の根源です

于 2010-11-15T19:37:55.023 に答える
1

変数 ($i=0) をリセットしても、それ以上のスペースは必要ありません。

変数 (整数型など) を宣言すると、その値に関係なく、定義済みの量のメモリがその整数に割り当てられます。ゼロに戻すと、値のみが変更されます。

新しい変数を宣言する場合、メモリを割り当てる必要があり、通常はゼロに初期化されるため、既存の変数をリセットしてもおそらく余分な CPU 時間はかかりません。

相互に排他的なループにインデックス変数を再利用することをお勧めします。コードが理解しやすくなります。多くの余分な変数を宣言している場合、コードを読んでいる他の人は、ループが完了した後でも「i」がまだ何かに使用されているかどうか疑問に思うかもしれません。

再利用してください!:)

于 2010-11-15T19:08:23.153 に答える
1

これは、解決する問題によって異なります。

PHP (およびその他のスクリプト言語) を使用する場合は、配列や長い文字列などの大きな変数に対して unset() を使用することを検討する必要があります。小さな変数 (integer/boolean/etc) を再利用したり設定解除したりする必要はありません。(遅い) スクリプト言語を使用している場合、それだけの価値はありません。

C などの低 (下位) レベル言語でパフォーマンスが重要なアプリケーションを開発している場合は、変数の再利用がより重要になります。

于 2010-11-15T20:03:19.680 に答える