問題タブ [object-layout]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - メンバー関数の追加の構文/指定子は、クラスのメモリ レイアウトにどのように影響しますか?
クラス データ メンバーとそのメモリ内表現を明確に理解していると思います。
クラスのメンバーは、オブジェクトのレイアウトを定義します。データ メンバーはメモリに次々と格納されます。継承を使用すると、派生クラスのデータ メンバーがベースのデータ メンバーに追加されるだけです。
しかし、オブジェクトの「ブループリント」が追加の構文要素を持つ関数メンバーによってどのように変更されるかを理解しようとすると、問題が発生します。次のテキストでは、オブジェクト メモリのサイズと構造を理解するのを難しくしている、問題のある1関数メンバーの構文をすべてリストしようとしました。
私が理解できなかったクラスメンバー関数:
- 関数の種類:
lambda
、関数へのポインター、変更する、変更しない。 - 追加の構文要素を含む: (非
friend
メンバー) 、、、、、、、、。virtual
final
override
static
const
volatile
mutable
質問:
オブジェクトのメモリ レイアウトのコンテキストで、異なる指定子を持つメンバー関数の違いと、それらがどのように影響するか?
ノート:
私はすでにこれとこれを読んでいますが、満足のいく答えはありません2。これは、重複に最も近い一般的なケース(私が理解している)について語っています。
1. オブジェクト メモリ レイアウトへの影響に関して。
2. 1 つ目はGCC コンパイラーについて説明しており、2 つ目は @m@zon に関する書籍へのリンクを提供しています。
c++ - standard_layout クラスのデータ メンバには、オブジェクトのアドレスからの固定オフセットがありますか?
クラスがis_standard_layoutの場合、特定の非静的データ メンバーがオブジェクトのアドレスから常に同じオフセットを持つことを保証するのに十分ですか (つまり、そのクラスの異なるインスタンス間でプロセス全体で同じ)?
c++ - C と C++ の構造体アラインメント
私は最近のインタビューで C++ 構造体フィールドのアライメントについて尋ねられ、C と C++ は構造体パッキングで同じ戦略に従うと理論付けました。
しかし、それは間違った仮定でした。インタビュアーは、一般的に C と C++ は異なる方法で構造体をパッキングしており、その逆を期待すべきではないと述べました。私見それは奇妙な声明です。pack "C"
バイリンガル C/C++ ヘッダー ファイルで使用するための C++ の構造体の修飾子はありません。
したがって、実際には、C++ で構造体を作成して C ライブラリに渡すことができないことを意味する可能性があります。一般に、そのフィールドは異なる方法で整列され、異なるオフセットを持つためです。しかし、実際には、ほとんどのプログラマーは、C POD構造体へのポインターを、いくつかのヘルパー メソッドを使用してこの構造体の周りの C++ ラッパーへの参照に変換する時点まで、この相互運用性に真剣に依存しています。この件について明確にしていただけますか?
c++ - int64_t を int32_t に変更するとクラス サイズが増加する理由
私の最初の例では、int64_t
. コンパイルしてクラスのサイズを取得すると、8 になります。
しかし、2 番目のビットフィールドをint32_t
クラスのサイズに変更すると、2 倍の 16 になります。
これは、GCC 5.3.0 と MSVC 2015 の両方で発生します。しかし、なぜでしょうか?
c++ - C++ 定数クラス データは、コンパイラによってクラス外で最適化できますか?
クラス外の定数変数は、コンパイラによる関数呼び出しに直接最適化できることは知っていますが、コンパイラが定数クラス変数に対して同じことを行うことは合法ですか?
次のように宣言されたクラスがある場合:
A のインスタンスを作成し、次のような関数を呼び出します。
代わりにこれを行い、クラスをsizeof(int)
小さくすることはコンパイラーに許可されていますか?: