6

アクセス速度スペース消費の観点から、静的変数とグローバル変数の違いを知りたいです。(私のプラットフォームを知りたい場合:Windows上のgccコンパイラ。(Windows上のARM7組み込みプログラミング用にTriton IDEでCygwinを使用しています。Tritonには、Windows上で実行できるJavaプラットフォーム上のgccコンパイラが付属しています。))

(明らかに、この質問からファイルと関数のスコープに関して知っています)

編集: OK、マイクロコントローラー/プロセッサー環境で答えを教えてください。

4

6 に答える 6

11

スペースに違いはありません。同じ量が必要です。

ただし、速度には違いがあります。静的の方が高速です。

もちろん、変数へのメモリアクセスはグローバルでも静的でも同じです。ただし、静的な場合、コンパイラは最適化できます。モジュールをコンパイルすると、モジュール外の関数への関数呼び出しが静的変数を変更できないことがわかります。したがって、何が起こるかを正確に認識し、たとえば、関数呼び出しでレジスタに保持できます。それがグローバルで、別のモジュールから関数を呼び出すと、コンパイラはそれが何をするかを知ることができません。したがって、関数が変数にアクセスして変更し、ストアとリロードが発生すると想定する必要があります。

gcc を使用すると、すべての.cソースを同時に渡すことができるため、異なるモジュールからの関数への関数呼び出しで何が起こるかを確認することもできます。.cそれを機能させるには、すべてのファイルを一度に渡す必要が-combineあり-fwhole-programます。は-fwhole-program、すべてのグローバルを静的にします (モジュールを静的ではなく、コンパイル ユニットを静的にします。つまり、指定されたすべての.cファイルをまとめて)。モジュール-combine間解析を行います。

于 2008-11-27T08:00:08.990 に答える
1

スペース消費量:基本的に違いはありません。スペースの問題が発生するのは、N個のオブジェクトファイルに隠された静的データの同じチャンクを取得できた場合のみです。Nの乗算係数を取得すると、単一のグローバルピースの場合はコピーが1つだけになる可能性があります。データの。ただし、これは設計ミスの問題です。情報を隠してはいけない場合を除いて、情報を隠すのは良いことです。

アクセス速度:違いはありません。

于 2008-11-27T07:09:12.103 に答える
1

推測することも、見積もることも困難です。時間はかかるかもしれませんが、サンプルプロジェクトを作って速度をテストします。ループでアクセス速度とスペースの両方をテストします。そのアーキテクチャのエミュレータでサンプル プロジェクトをテストします。

于 2008-11-27T07:10:11.557 に答える
1

パッキング(スペースの場合)とキャッシング(速度の場合)の問題から違いが生じると思います。どちらも、他のほぼすべてのものからも発生する可能性があります。

于 2008-11-27T07:30:23.980 に答える
0

ジョナサンの言うことは正確ではありません。静的変数とグローバル変数の両方が ZI (または RW データ) 領域に保存されます (保存する必要があります)。コンパイラは、厳密にレジスタを「保持」することはできません-値をレジスタにロードし、そのレジスタをすべての操作に使用し、その値を保存することは、コンパイラ固有の最適化です。それでも、コンパイラがグローバル変数に対してもそれを行わない理由はありません。もちろん、揮発性にしない限り。ただし、技術的には、静的変数を揮発性にすることもできるため、やはり違いはありません。

編集:そうそう-スペース:違いはありません。

于 2008-12-10T20:39:09.220 に答える
0

spaceに関しては、記述した env に違いはありません。静的変数またはグローバル変数は、同じ量のメモリを消費します。

速度を考慮して (ただし、良い方法ではありません) 、1 つのファイルの外部にある var にアクセスする必要がある場合は、グローバル varsを使用することをお勧めします。( の使用を参照external char my_global_char_placed_else_where;)

より良い練習のために、代わりに get/set 関数を使用しますが、遅くなります。したがって、グローバルな var の get/set にマクロを使用して、var が実際にはグローバルであることをコードのリーダーから隠すことができますが、それは不正行為のようなものです。しかし、コードをより読みやすくすることができます。

関数内に var を隠すことを比較すると、関数の外に配置することと違いはなく、より多くの関数が var にアクセスできます。

私自身、開発には MSP430、ARM7 (テスト用のみ)、および AVR32 マイクロを使用しています。

于 2008-11-27T10:13:37.473 に答える