1

クラス データ メンバーとそのメモリ内表現を明確に理解していると思います。

クラスのメンバーは、オブジェクトのレイアウトを定義します。データ メンバーはメモリに次々と格納されます。継承を使用すると、派生クラスのデータ メンバーがベースのデータ メンバーに追加されるだけです。

しかし、オブジェクトの「ブループリント」が追加の構文要素を持つ関数メンバーによってどのように変更されるかを理解しようとすると、問題が発生します。次のテキストでは、オブジェクト メモリのサイズと構造を理解するのを難しくしている、問題のある1関数メンバーの構文をすべてリストしようとしました。

私が理解できなかったクラスメンバー関数:

  • 関数の種類: lambda、関数へのポインター、変更する、変更ない
  • 追加の構文要素を含む: (非friendメンバー) 、、、、、、、、。virtualfinaloverridestaticconstvolatilemutable

質問:

オブジェクトのメモリ レイアウトのコンテキストで、異なる指定子を持つメンバー関数の違いと、それらがどのように影響するか?


ノート:

私はすでにこれこれを読んでいますが、満足のいく答えはありません2これは、重複に最も近い一般的なケース(私が理解している)について語っています。

1. オブジェクト メモリ レイアウトへの影響に関して。

2. 1 つ目はGCC コンパイラーについて説明しており、2 つ目は @m@zon に関する書籍へのリンクを提供しています。

4

1 に答える 1

2

メンバー関数は、オブジェクトのメモリ レイアウトの一部ではありません。メンバー関数に起因する唯一のものは、仮想メソッド テーブルなど、動的ディスパッチを実行するために使用される実装定義の構造体への非表示の参照です。この参照は、仮想メンバー関数が少なくとも 1 つある場合にのみオブジェクトに追加されるため、仮想関数を持たないクラスのオブジェクトはこのオーバーヘッドから解放されます。

特定の質問に戻ると、オブジェクトのメモリ レイアウトに影響を与えるメンバー関数の唯一の修飾子はvirtual*です。他の修飾子は、関数自体の解釈方法に影響を与えますが、オブジェクトのメモリ レイアウトは変更しません。

* overrideキーワードは、基本クラスに仮想メンバー関数が存在することも示しますが、オプションです。追加または削除しても、オブジェクトのメモリ レイアウトは変更されません。

于 2015-09-26T11:29:50.137 に答える