2

以前、stackoverflow に関する質問をしたことがありました (興味がある場合は、リンクを参照してください: Passing by reference "advanced" concept? )

興味深いことに、回答の 1 つに興味をそそられ、別の質問に値すると感じました。

const int& x = 40;

40 がたまたま CPU キャッシュ (右辺値) の値である場合。それでは、その行を書くことによって、プロセスの存続期間中 40 という数値を保持するためにキャッシュ メモリを予約するだけでしょうか? そして、それは悪いことではありませんか?

ありがとうございました

4

2 に答える 2

7

リテラル40はほぼ確実に、おそらくアセンブラ内の読み取り専用メモリに存在します (小さな値の場合は通常、レジスタまたはアドレスを設定できる命令があり、大きな値の場合は定数としてどこかに存在します)。「キャッシュ内」には存在しません。それへの参照を作成するconstと、コンパイラが一時的なものを保持するのに適していると判断した場所 (おそらくスタック上) に一時的なものが構築されます。これがキャッシュに存在するかどうかは、システム次第です。

このテンポラリのアドレスが取得されない場合、実際には作成されない可能性があります。C++ 標準のすべての規則は、"as if" 規則によって管理されます。その結果、参照とリテラルは同一になります。参照のアドレスがconst取得された場合、コンパイラはオブジェクトをどこに配置するかを決定する必要があり、実際にはパフォーマンスへのわずかな影響が見られる場合があります。

于 2012-11-11T15:12:50.023 に答える
5

プログラムからキャッシュのスペースを予約することはできません

それは本当にあなたのコントロールではありません。キャッシュ制御の決定は、時間的および空間的な局所性を調査する独自のコントローラーによって行われ、とりわけ、どのキャッシュラインを置き換えてどれを保持するかを決定します。

通常、異なるキャッシュと仮想メモリ アドレス空間 (物理メモリ + スワップへのマップ) に、データの複数のコピーがあります。


メモリの管理方法は、それよりもはるかに複雑です。システムは、メモリを扱うときに毎回仮想アドレスを生成します。

この仮想アドレスは物理アドレスに変換されます。この変換により、キャッシュ、物理メモリなどのアドレスが生成される可能性があります。必ずしも 1 つのメモリにマップされるとは限りません。スワップ アウトされている場合は、ページ フォールトが発生し、そのページがメモリに読み込まれます (複数レベル)。

キャッシュ管理などの低レベルの操作は、このレベルでの決定の影響を受けません。

于 2012-11-11T15:12:23.720 に答える