5

たとえば C++ や C# で記述した oop コードは、マシン コードに、または C# の場合はバイトコードに、どの程度正確に変換されるのでしょうか? つまり、オブジェクトはどのように翻訳されるのでしょうか?

手続き型プログラミングでは、機械語の関数が実際に実際にサポートされているため、コンパイル後にどのように見えるかは明らかです。しかし、oop プログラミングの場合、機械語にはオブジェクトがありません。

私の理論は、オブジェクト自体を、データのみを含む (メンバー関数を含まない) ある種の C のような構造体にコンパイルし、メンバー関数が呼び出されたときに、オブジェクト自体のデータ構造体である追加のパラメーターを受け入れるというものです。私は正しいですか?

4

3 に答える 3

2

推測する必要はありません。生成された "アセンブリ" (実際には MSIL) コードを見てください。

C# コンパイラによって生成された MSIL / CIL を表示するにはどうすればよいですか? なぜアセンブリと呼ばれるのですか?

于 2013-05-19T11:39:32.203 に答える
1

それは実装に依存します。しかし実際には、仮想テーブル (「vtable」) を使用するのが一般的です。各クラスには、各メンバー関数の実装へのポインターのリストを含む仮想テーブルがあります。各オブジェクトは、適切な vtable へのポインターを取得します。

言語とコンパイラのフラグに応じて、vtable 内の適切なポインターは、関数シグネチャ (名前と引数) または単にインデックスによって検索される場合があります。

メンバー関数がその vtable ポインターを介して呼び出される場合、確かにオブジェクト データへのポインターが必要です。しかし、それはスタックまたはレジスターで渡される可能性があります。

于 2013-05-19T11:43:57.083 に答える