17

次のように、変数を静的にすることを宣言する人がいるのはなぜですか。

char baa(int x) {
    static char foo[] = " .. ";
    return foo[x ..];
}

それ以外の:

char baa(int x) {
    char foo[] = " .. ";
    return foo[x ..];
}

Linuxのソースコードアプリケーションでは非常に一般的なようです。パフォーマンスに違いはありますか?はいの場合、誰かが理由を説明できますか?前もって感謝します。

4

5 に答える 5

20

これは、パフォーマンス自体ではなく、メモリ使用量を減らすためのものです。パフォーマンスは向上しますが、(通常は)そのようなコードが表示される主な理由ではありません。

関数内の変数はスタックに割り当てられ、関数が呼び出されるたびに予約および削除されます。重要なことに、これらの変数は、多くの組み込みおよびリソースに制約のあるプラットフォームで深刻な制約となるスタックサイズの制限にカウントされます。

ただし、静的変数は、.BSSまたは.DATAセグメント(明示的に初期化されていない静的変数はに移動し.BSS、静的に初期化された静的変数はに移動します.DATA)のいずれかにスタックから格納されます。コンパイラーはこれを利用して、特定の最適化を実行することもできます。

于 2012-05-09T23:52:32.480 に答える
9

通常の実装では、バージョンありstaticはコンパイル時に文字列をメモリ内のどこかに配置しますが、バージョンなしでstaticは関数が(呼び出されるたびに)スタックにスペースを割り当て、そのスペースに文字列を書き込みます。

したがってstatic

  • より速くなる可能性があります
  • 使用するメモリが少なくなる可能性があります
  • 使用するスタックスペースが少なくなります(一部のシステムではリソースが不足しています)
  • キャッシュをより適切に使用できます(小さな文字列では大したことではない可能性がありますが、foo何か大きい場合はそうなる可能性があります)。
于 2012-05-09T23:55:24.087 に答える
3

はい、パフォーマンスは異なります。毎回初期化される自動ストレージ内の変数とは異なり、静的変数は、関数を初めて実行するときに1回だけ初期化されます。fooに書き込まれない場合、他の違いはありません。に書き込まれる場合、静的変数への変更は呼び出し間で存続しますが、自動変数への変更は次回関数を介して失われます。

于 2012-05-09T23:52:04.617 に答える
2

メソッドで静的変数を定義するということは、変数が「解放」されないこと、つまり、後続の呼び出しでその値を保持することを意味するだけです。アルゴリズムによってはパフォーマンスの向上につながる可能性がありますが、それだけではパフォーマンスの向上にはなりません。

于 2012-05-09T23:52:33.517 に答える
2

はい、uが変数を静的として宣言した場合、違いが生じます。

  1. まず、メモリはスタックではなくbssまたはデータセグメントのいずれかに割り当てられます。

  2. 第二に、他の関数変数とは異なり、毎回ではなく、一度だけ初期化されるため、確実に違いが生じます。

  3. 第三に、b / w関数呼び出しの値を保持するため、状況に応じて使用する必要があります。

于 2012-05-10T08:53:14.540 に答える