4

そのため、ファームウェア用の「クイック アンド ダーティ」プロファイラーに取り組んでいます。一部の機能にかかる時間を知る必要があるだけです。ロギングはコストがかかるため、毎回かかる時間を単純に印刷すると結果が歪められます。そのため、一連の結果を配列に保存し、しばらくしてからダンプしています。

1 つのコンパイル ユニット (1 つのソース ファイル) で作業しているときは、結果を格納する静的配列がたくさんありました。ここで、複数のファイルにわたってこれを行う必要があります。コードを「コピーして貼り付ける」ことはできますが、それは醜いだけです(我慢してください)。別のコンパイル ユニットにタイミング コードを配置し、静的変数を作成し、ヘッダー ファイルにアクセサー関数を提供すると、それらの静的変数にアクセスするたびに関数呼び出しのオーバーヘッドが発生します。

コンパイル単位の静的変数に直接アクセスすることは可能ですか?

私は常にグローバル変数を使用せずにデータをカプセル化しようとしましたが、この状況では単に速度の問題からカプセル化が必要です。

これが理にかなっていることを願っています!ありがとうございました!

編集:わかりましたので、私が求めていることは不可能のようです。本質的に別のコンパイル単位のデータに直接アクセスできるようにする代替手段を見つけた人はいますか?

EDIT2:パブロとジョナサンの回答ありがとうございます。私の状況では(ジョナサンによると)静的データへのポインターを取得する明確な場所がなかったため、最終的にパブロを受け入れることになりました。再度、感謝します!

4

2 に答える 2

8

staticいいえ、別のコンパイル単位からコンパイル単位の変数にアクセスすることはできません。staticキーワードは、それが起こらないように正確に防ぎます。

あるコンパイル単位のグローバルに別のコンパイル単位からアクセスする必要がある場合は、次のようにします。

file1.c:

int var_from_file1 = 10;

file2.c:

extern int var_from_file1;
// you can access var_from_file1 here

static宣言からキーワードを削除できれば問題ありません。既存のソース コードを変更することが常にオプションではないことを理解しています (既存のレガシー コンパイル コードを扱う IE)。

于 2011-01-13T16:30:52.167 に答える
3

別のユニット C2 からコンパイル ユニット C1 の静的変数を取得するには、C1 の一部の関数が C2 で使用できる変数へのポインターを作成するか、一部の非静的変数に静的変数へのポインターが含まれている必要があります。

したがって、「静的変数」を単一の構造にパッケージ化してから、その構造へのポインターを返す関数を作成できます。その関数を呼び出して、静的変数にアクセスできます。

同様のルールが静的関数にも適用されます。ファイル内の関数 (または非静的変数) が関数へのポインターを使用可能にする場合、静的関数はファイルの外部から間接的に呼び出すことができます。

ポインターを介したアクセスが直接としてカウントされない場合は、スヌーカーです。staticモジュールがコンパイルされたときに変数からキーワードを削除しない限り、非表示にすることはできませんstatic-おそらくCプリプロセッサを介して。名前の衝突に注意してください。

于 2011-01-13T16:47:31.093 に答える