スタックとヒープの主な違いを理解していると思います。
次のプログラムでは、サイズ n のオブジェクトがヒープ上に作成されます。このソファの名前のないオブジェクトを参照するポインター p がスタック上に作成され、4 バイトを占めます (少なくとも私のシステムでは)。私がよく理解していれば、参照は余分なメモリを使用しないため、それ以上のメモリは割り当てられません (スタック上の main() によって返される int を除く)。
Class Object; // n bytes
int main() {
Object* p = new Object();
Object& r = *p;
// ...
}
それでも、メモリ管理はまだ完全には明確ではありません。
1) 名前 p と r はどこに保存されていますか? どちらもローカル名なので、スタックにも入れるべきだと思いますか? これは、変数名とそれが参照するメモリの一部との間のバインディングを格納するために余分なメモリを必要としませんか?
2) ポインタの型はどこに格納されていますか? ポインターはスタック上で 4 バイトしか占有しません。これは (私が思うに) メモリ アドレスを格納するための正確なサイズです。コンピューターは、そのアドレスでどのタイプが見つかるかをどのように認識しますか?
3) (2) と同様に、ヒープ上のオブジェクトには n バイトのストレージが必要であり、それへの唯一の (直接) 参照は 0 バイトです。このオブジェクトの型はどこに格納されているので、r を使用すると、それがどの型であるかがわかりますか?
4) コンパイルされたプログラムも、その実行をガイドするためにメモリのどこかに常駐していることを理解しました。これはスタックまたはヒープにありますか、それともメモリの別の部分ですか?