4

変数がある場合int d; // some commentint daysElapsedSinceBlahBlahBlahBlahノーコメントよりはましかな。より現実的ですが、メモリを浪費しますか?

4

3 に答える 3

8

これを とマークしましlanguage-agnosticたが、例は C 言語ファミリに対応しています。C に似た言語では、変数の名前はメモリを無駄にすべきではありません。これは、コンパイラの単なるラベルです。結果のバイナリ コードでは、メモリ アドレスに置き換えられます。

一般に、結果のバイナリ内に変数の名前を格納する利点はありません。考えられる唯一の使用法は、極端なデバッグ、リバース エンジニアリング、または奇妙な形式のリフレクションです。これらはどれも通常の使用例ではありません。

于 2013-03-09T21:45:53.707 に答える
7

言語とその実装に完全に依存しますが、私が知っているいくつかの言語に基づいた例をいくつか挙げることができます。

C および C++ では、変数名はプログラマーおよびコンパイラーの記号識別子です。コンパイラはそれらをメモリ アドレスや CPU レジスタに置き換えるか、アクセスをインライン化して完全に排除します。名前は、生成されたコードには表示されません。これらは、生成されたデバッグ情報に表示される場合がありますが、プログラムのリリース ビルドでは、対話的なステップ デバッグを行う必要がなくなったときに省略できます。

Java では、コンパイラは関数ローカル変数名を削除し、スタック相対オフセットを使用するようにコードを書き直します。フィールド名 (つまり、クラス レベルの変数) は、コンパイルされたバイトコードに保持されます。これは主に、クラスが個別にコンパイルされ、実行時に動的にリンクされる方法のために必要とされるため、コンパイラはプログラム全体の状態を一度に最適化できません。フィールド名が保持されるもう 1 つの理由は、リフレクションを通じて使用できるためです。仮想マシンは実行時に、C および C++ の方法でメモリ アドレスとネイティブ CPU レジスタのみを使用するネイティブ コードを生成できます。とにかく、フィールド名はリフレクションのためにメモリに保持され、追加のロードされたクラスをリンクできるようにします。ただし、すべての記号名をはるかに短くすることができます。

JavaScript や PHP などのeval関数を備えた言語では、ランタイム文字列を介して名前ですべてアクセスできるため、理論的にはローカル変数名も保持する必要があります。優れたインタープリターは、特定の変数が名前でアクセスされていないことを証明できる場合に、高速メモリ アドレスを使用するようにこれを最適化できます。

真の行ごとのインタープリターでは、BASICの非常に古い実装のように、インタープリターはソース コードから直接動作するため、変数名を常に維持する必要があります。次の行に移動するときに各行を忘れているため、ソース内の名前以外に変数を追跡する方法はありません。実行時に完全なソース コードをメモリに保持する必要があり、多くの場合 64 KB 以下に制限されていたため、変数名は本当に重要でした! そのため、この時代のコードはしばしば不可解な短い名前を使用 (および再使用) しました (ただし、BASIC コードが雑誌に印刷されて入力されることがあり、これらのプラットフォームには特に優れたキーボードがなかったなどの理由もあります)。または編集者。)

1980 年代以前のインタープリター用にプログラミングしている場合を除き、識別子名はいずれにせよ非常に安価なので、気にする必要はありません。理解できるように十分に長く、すぐに読めるように十分に短い名前を選択してください。残りはコンパイラーに任せるか、コードの作成後にオプティマイザーまたはミニファイアーを実行します。

于 2013-03-14T13:20:34.273 に答える
6

変数名がメモリを占有することはありません。少なくとも、心配するほどではありません。一部の言語の実装では、変数名をどこかに保存しますが(言語でこれが必要な場合もあります)、それらが占めるスペースは、飛び回っている他のすべてのものと比較して非常に小さいです。他の指標 (読みやすさ、規則など) によって最適なものを使用してください。

于 2013-03-09T22:00:22.183 に答える