C++ Complete Reference に記載されているように、定数データは ROM に格納されます。ただし、ローカル変数は RAM にあるスタック内に格納されます。では、ローカル定数データを宣言すると、どこに格納されるのでしょうか? RAMまたはROM?
3 に答える
可能な唯一の真の答えは、「場合による」です。
C++ は、ハードウェアより上位の 1 レベルの抽象化であり、オペレーティング システムなどの他のソフトウェアによって「ホスト」される可能性があるコードを生成します。
ハードウェアをどのように使用するかは、ハードウェア自体がどのようなもので、どのように動作し、どのように管理されているか、およびコンパイラの設計者がそれらすべての機能をどのように使用するつもりであったかによって異なります。
定数と変数の違いは、変数は (言語設計者によって) 変更されて値を保持するように設計されているのに対し、定数は決して変更されないように設計されていることです。
C++ が定数について言う唯一のことは、それらを変更しようとすると「未定義の動作」が発生するということです。つまり、「言語設計者は何が起こるか (または起こらないか) について何も言わない」ということです。
コンパイラ設計者は、作業しているプラットフォームと互換性を保ってできることを行います。一部の定数は実際の ROM に保存され (マイクロコントローラーに考えてください)、一部は「書き込みアクセスが拒否された」状態で RAM に保存されます (そのため、それらを変更しようとするとハードウェア トラップが生成されます: 何が起こるかは OS によって異なります: 通常、トラップは言語によってサポートされているかどうかにかかわらず、OS 例外に変換されます) そのような「機能」が存在しない単に RAM 内にあるものもあれば、マシンコード命令自体の中にあるものもあります。
いずれにせよ、自分でハードウェアをプログラミングしていない限り、この詳細は気にする必要はありません。そして、「定数はROMに入れることができる」と言うのは本当かもしれませんが(プラットフォームが許可している場合)、「定数はROMに格納されています」は単なる嘘です。
実行時にスタックに格納されるローカル定数データ。通常、コンパイル時に読み取り専用セグメントに格納される静的ローカルおよびグローバルデータ。ただし、コンパイラーはいくつかの最適化を実行し、ローカル定数でさえ読み取り専用セグメントに格納できます。
「ROM」という用語は通常、物理的に書き込みができないハードウェア用に予約されています。定数は物理的に「RAM」に配置されます (そうでなければ、プログラムをどのようにロードできますか?)
技術的には、仕様への書き込みに対する保護はほとんどありません...そうすると、未定義の動作になります。
物の保管場所に関しては、現在のアーキテクチャーにはいくつかの典型的な方法があります。しかし、コンパイラはかなり自由に独自の決定を下すことができます。たとえば、これを参照してください。