0

先日、C99規格で書かれたプログラムをC11にコンバートしていました。基本的には MSVC でコードを使用することを目的としていましたが、これは Linux で書かれており、ほとんどがデフォルトの GCC 動作でコンパイルされていました。コード変換中に、ステートメントの後に関数の変数を宣言できないことがわかりました。つまり、関数の先頭で変数を宣言する必要があります。

しかし、私の質問は、キャッシュ ヒットを最大化するために、変数をその使用の近くで宣言する必要があるという効率的なプログラミング規則に反するのではないかということです。たとえば、LOC が 200 の大きな関数では、関数の最後近くで大きな静的ルックアップ配列を使用したいと考えています。使用の直前に宣言して初期化すると、キャッシュ ヒットが増えませんか? それとも、C11 C言語標準のいくつかの基本的なポイントが欠けているだけですか?

4

2 に答える 2

4

プログラムをコンパイルしている標準のバージョンについて、混乱しているようです。私の知る限り、MSVC は最近の C 標準をサポートしていません。

しかし、あなたの質問の核心になると、いいえ、これは効率の問題ではありません。コンパイラは、プログラムの観察可能な動作が変わらない限り、好みに合わせてステートメントを並べ替えることができます。したがって、最新のコンパイラは、最初に使用する前に、可能な限り最新の新しい変数に常に触れます。

于 2012-10-15T15:46:07.260 に答える
2

変数宣言が表示される場所は、キャッシュの動作には影響しません。宣言をするだけでは、記憶には影響しません。

ただし、初期化を別の割り当てに分離する必要がある場合があります。これは、関数の先頭 (近く) でメモリ アクセスを引き起こす初期化子がないことを確認するためです。

于 2012-10-15T15:46:07.900 に答える