質問

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

(明らかにこの質問

編集: [OK]をクリックすると、マイクロコントローラー/プロセッサー環境に関する回答が表示されます。

役に立ちましたか?

解決

スペースに違いはありません。同じ量を使用します。

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

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

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

他のヒント

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

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

推測または推定するのは困難です。おそらく時間がかかりますが、サンプルプロジェクトを作成し、速度をテストします。アクセス速度とスペースの両方をループでテストします。そのアーキテクチャのエミュレータでサンプルプロジェクトをテストします。

(スペースの)パッキングと(速度の)キャッシングの問題に違いがあると予想します。両方とも、他のほぼすべてのものからも発生する可能性があります。

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

速度の考慮事項(ただし、良い習慣ではありません)の場合、1つのファイル以外の変数へのアクセスが必要な場合は、グローバル変数を優先できます。 ( external char my_global_char_placed_else_whereの使用を参照;

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

関数内で変数を非表示にした場合、関数の外に配置した場合と違いはなく、より多くの関数が変数にアクセスできます。

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top