PéterTörökの回答から最初の文を盗みますが、詳しく説明し ます。必ずしもそうではありません。またmyval
、コンパイルされたコードではなく、そのままの値5を使用することもできます。
myval
メモリーにスペースを割り当てることによって通常の変数のように処理すると、アーキテクチャーとメモリーの処理方法に応じて、非常に小さなものから深刻なものまで、パフォーマンスに影響を与える可能性があります。
そのように動作すると、コンパイラーは、「メモリー位置にあるものをレジスターRにロードする」という行に沿って何かを示す命令を発行しますmyval
。の場所myval
命令のオペランドとして、命令自体と同じデータブロックから直接取得されます。最近のCPUでは、この値は命令のプリフェッチにより、オンチップですぐに利用できます。アドレスを取得しても、CPUはメモリから値を取得する必要があります。場所がキャッシュ内で近くにある場合、それはすぐに行くかもしれませんし、そうでない場合、それほど速くは行かないかもしれません。CPUは値を取得するためにオフチップにする必要があるだけでなく、そうすることで、後で戻す必要のあるキャッシュから他のより有用なデータを押し出す可能性があります。メモリを仮想化するOSでプログラムを実行している場合、その場所へのアクセスによりページ違反が発生し、必要なページが周辺機器(ディスクなど)のI / Oを介してRAMに読み込まれるまでプログラムがスリープ状態になる可能性があります。
定数値をオブジェクトコードにハードワイヤリングすることにより、コンパイラは「レジスタRに値をロードする」などの命令を発行します5
。上記のメモリアドレスと同様に、5
は命令のオペランドであり、同じ方法で使用できます(つまり、プリフェッチされます)。CPUが5
レジスタRに入れてビジネスに取り掛かるのに必要なものがすべて揃ったので、ここで類似点が終了します。通常、アドレスとレジスターは同じサイズであるため、命令が占めるバイト数に違いはなく、実際の実行は、メモリから何かを釣り出したときに発生する可能性のあるキャッシュミスやページフォールトの可能性がゼロです。
Péterが指摘したように、コンパイラーはmyval
デバッグビルド用にスペースとシンボルを割り当てることができます。これを行ってもその値をハードワイヤリングしても害はありません。値は何があっても同じままであり、シンボルは人間がデバッグで使用するために実際にそこにあるためです。
レジスタは本来整数であるため、これはレジスタに保持できる値にのみ適用されることに注意してください。他の定数はメモリに残ります。
storage of const object
の質問のソースにはほとんど価値がありません。