2

単純なVMを作成していますが、オブジェクトと構造体のメンバーアクセスの実装について質問があります。

プログラムの開始アドレスは実行ごとに任意であり、その後、そのオブジェクトのすべてのアドレスも任意であるためです。

したがって、オブジェクトまたはそのメンバーオブジェクトにアクセスするために私が考えることができる唯一の方法は、「ベース」ポインタからのオフセットにアクセスすることです。つまり、プログラム構造内のすべてにアクセスするために必要な算術演算があります。

私の質問は、これがプロのコンパイラで行われる方法であるかどうかです。これは、明らかにこのアプローチによってランタイムにオーバーヘッドが追加されるためです。私自身、このプロセスをランタイムからオフロードする方法は考えられません。メモリ割り当てとそのアドレスの一貫性?

4

1 に答える 1

2

何十年もの間、ほとんどのコンピュータは、ベースとオフセットの組み合わせとしてアドレスを指定できるアドレッシングモードを提供しており、実際の計算は、CPUクロックサイクルの追加コストなしでハードウェアで実行されます。

最近(過去数十年)のコンピューターは、メモリレイアウトを仮想化するためのハードウェアを提供します。つまり、アイテムの物理アドレスが実行ごとに異なっていても、仮想アドレス空間のアドレスは同じままです。繰り返しになりますが、計算はプログラムの実行中のバイナリコードに対して暗黙的かつ目に見えない形で実行されるため、ベースアドレスを使用するための追加コストはありません。

于 2012-07-15T07:04:52.450 に答える