0

static int toto;関数または変数がソースコード全体ではなくローカルファイルでのみ表示されるようにするために、静的定義(例:)が使用されていることを知っています。

静的定義が影響を与えるかどうか疑問に思います:

  1. バイナリプログラム実行のパフォーマンスについて?
  2. コードメモリのメモリサイズの最適化について?
  3. データメモリのメモリサイズの最適化について?
4

5 に答える 5

1

これは、コンパイラがどれだけ賢いか、どのようにコンパイルするかなどに実際に依存するため、一般的に答えることは不可能です。

コンパイラがコードを最適化するのが簡単になる場合があります(たとえば、変数を完全に削除するか、関数が外部から呼び出されないことがわかっているため、関数をインライン化します。この単一の変換ユニットをコンパイルするだけでも)。ただし、これは実際にはコンパイラと変数または関数の使用方法(たとえば、関数で使用される前に常に初期化されるかどうか)によって異なります。

したがって、正しく使用すると、実行時間だけでなく、コードサイズとメモリ使用量にもプラスの影響を与える可能性があります。


static関数内の変数に関しては、状況が完全に異なる可能性があります(以前の呼び出しから変数を保持している可能性があるため、削除できなくなる可能性があります)。

于 2012-11-14T10:50:35.267 に答える
0

staticは、変数または関数を現在の変換ユニット(現在のソースファイル)内に表示する方法にすぎません。これは、global static変数にが含まれていることを意味しますinternal linkage

したがって、もちろん、すべての識別子が内部リンケージを持つ実行可能ファイルを構築することは、外部シンボルがないか、外部シンボルの数が少ないため、リンカーによって解決される必要がないため、ごみが速くなります。

しかし、プラットフォーム、コンパイラ、バージョンを知らなければ確実に言えないので、一般的な説明に過ぎません。

于 2012-11-14T10:51:01.943 に答える
0

一般化された答えを与えることは、コンパイラとユースケースの両方に依存するため、かなり困難です。

バイナリプログラム実行のパフォーマンスについて?

これは、値が一定であると判断されたかどうかによって異なります。一定であると判断された場合、その値は高い最適化レベルで伝播および折りたたまれます。また、関数内またはTUスコープで静的であるかどうかにも少し依存します。TUスコープでは、他のBSS割り当て変数と同じように扱われ、複数のコピーがあります。関数レベルでは、アドレスの間接化により、スタックまたはレジスタのローカル変数と比較して、かなりのオーバーヘッドが追加されます(ただし、L1キャッシングはオーバーヘッドの大部分を軽減します)。

コードメモリのメモリサイズの最適化について?

関数の静的変数の場合を除いて、コードのメモリサイズに影響を与えることはありません。静的変数はスタック割り当てできないため、すべてのストアとロードのアドレスアクセスのオーバーヘッドを追加するメモリアドレスアクセスが必要です。ただし、ほとんどのシステムでは、実際のサイズの増加はごくわずかです。

データメモリのメモリサイズの最適化について?

作成されるコピーの数によって異なります。これは、含まれるTUの数によって異なります(たとえば、ヘッダーが含まれるTUごとに静的ヘッダー変数を作成できます)。

于 2012-11-14T10:52:34.983 に答える
0

実際、マリオが指摘したようにstatic、ローカル変数を定義すると、コンパイラーは、連続する呼び出し間でその値を保持するように指示されます。これは多くの影響を与える可能性があります。ほとんどの場合、この変数は「モジュールグローバル」変数になるため、スタックには入れられません(埋め込みfwを参照)。

別の効果は、static異なるスレッドから同時に呼び出された関数内でvarを使用している場合、RAM使用量が異なる(より低い)(そしてもちろん、非常に異なる動作)ということです。

于 2012-11-14T10:57:09.877 に答える
0

一般的な答えは、「悪化させることはできませんが、改善する可能性はあります」です。staticやconstなどは、2つのことを行います。これらは、実行できることを制限し、コンパイラがより適切な決定を行えるようにします。コンパイラーはこれらの決定を行う必要はありませんが、害を及ぼすことはなく、運が良ければ役立つでしょう。

于 2012-11-14T10:58:59.817 に答える