1

次のようなことを行うことの間にパフォーマンスの違いはありますか:

void function() {
char bufgfer[256];
// ...
}

void function() {
static char bufgfer[256];
// ...
}

関数の動作方法が変わったことは知っていますが、パフォーマンスはどうですか? 2番目の方が速いですか?

ハンクス

4

3 に答える 3

3

パフォーマンスに基づいてオブジェクトの保存期間 (静的または自動) を選択しないでください。ストレージ期間は、パフォーマンスの目的では存在しませんが、セマンティクスが大きく異なるためです。バッファを静的にすると、コードの多くの潜在的な用途、最も明らかにマルチスレッドでの用途が恐ろしく壊れます。オブジェクトが静的な保存期間を持つ必要があるのは、呼び出し間で永続化する必要がある長期的なグローバル状態を格納している場合のみであり、その場合でも通常は設計ミスです (この状態は、呼び出し元が保持するコンテキストに保持する必要があります)。

そうは言っても、静的ストレージ期間でパフォーマンスが向上する可能性は低く、多くの場合 (特に PIC 共有ライブラリまたは PIE 実行可能ファイル) 静的変数へのアクセスは、自動変数へのアクセスよりも遅くなります。これは、関数が GOT レジスタをロードする必要があるためです (まだロードされていない場合)、GOT 間接または GOT 相対アドレッシングを実行します。

于 2012-04-05T14:23:37.773 に答える
3

バッファーが CPU の近くのキャッシュで終了する場合、最初の方法はおそらく高速です。

実行時にバッファーが何らかの形で割り当てられるため、最初のバージョンの方が遅いと思われる場合は、そうではありません。これは理由ではありません。これらはすべて、コンパイル時にコンパイラによって処理されます。さらに、バッファーを静的にすると、おそらくキャッシュから除外されます。(しかし、誰が知っているか、気にしますか?)

時期尚早の最適化を検討しているようです。

于 2012-04-05T12:00:10.530 に答える
2

関数内の他の変数に依存する場合もあれば、遅くなる場合もあります。アクセスとは何ですか。

最も重要なことは、必要に応じて使用することです。最適化の観点からではなく、機能の観点からです。変数を静的にする必要がない場合は、そうすべきではありません。さまざまなプラットフォームでの影響は、ほとんどの場合無関係です。

于 2012-04-05T12:05:47.407 に答える