問題タブ [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.

0 投票する
4 に答える
318 参照

c++ - オブジェクトへのポインタ==最初のメンバーへのポインタ?

次のコードのif条件がtrueになるのはなぜですか?

空のクラスに関するStroustrupのFAQ 、特に以下のステートメントを読んでいると、少し混乱しました。

0 投票する
4 に答える
1071 参照

c++ - C ++でのネストされたクラスと多重継承のメモリレイアウトの違いは?

COMオブジェクトを使用したいクライアントがその方法を知ることができるように、COMがそのオブジェクトのレイアウトをどのように指定するかを理解しようとしています。

複数のインターフェイスを実装する COM オブジェクトは、ネストされたクラスや多重継承を使用するなど、さまざまな方法でそれを実行できることを読みました。

私の理解では、両方の手法が同じメモリ レイアウト (COM 仕様に準拠) を生成する必要があるため、COM オブジェクト (たとえば C) を使用するクライアントは、その方法を知ることができます。

したがって、私の具体的な質問は、多重継承とネストされたクラスを使用して実装された c++ オブジェクトのメモリ レイアウトに違いがあるかどうかです。

また、COM オブジェクトのレイアウトが指定されている場所を教えてもらえますか?

0 投票する
4 に答える
3365 参照

c++ - C++ での仮想継承

C ++での仮想継承について読んでいるときに、Webサイトでこれを見つけました

多重継承を使用する場合、仮想継承を使用する必要がある場合があります。これの良い例は、標準の iostream クラス階層です。

仮想メンバーから派生したクラスの数に関係なく、仮想メンバーのインスタンスが 1 つしか存在しないことを C++ はどのように保証しますか? C++ は追加レベルの間接化を使用して、通常はポインタを使用して仮想クラスにアクセスします。つまり、iostream 階層内の各オブジェクトには、ios オブジェクトの共有インスタンスへのポインターがあります。追加レベルの間接化により、パフォーマンスのオーバーヘッドがわずかに発生しますが、支払う代償はわずかです。

私は声明と混同しています:

C++ は追加レベルの間接化を使用して、通常はポインターを使用して仮想クラスにアクセスします。

誰もこれを説明できますか?

0 投票する
1 に答える
188 参照

garbage-collection - オブジェクト指向言語のヒープ オブジェクト表現

修士論文の一環として、出身大学で開発されたオブジェクト指向言語のコンパイラを書いています。現在、コンパイラは、仮想マシン上で実行されるアセンブラを出力します。仮想マシンは、スタック操作、オブジェクト生成、ヒープ管理、ガベージ コレクションなどのすべてを処理します。

私のコンパイラのターゲット アーキテクチャは、MIPS に似た CPU です。

オブジェクトのレイアウトを開発するための戦略と、実行時にガベージ コレクションを実装してトリガーするためのアイデアを探しています。もちろん、GCC がこれを C++ でどのように実装しているかを分析することもできますが、いくつかの優れた出版物/リソースを紹介してもらいたいと思います。

0 投票する
3 に答える
145 参照

c++ - 余分な継承は、オブジェクトの構造やインスタンス化に違いをもたらしますか?

コードには、いくつかの特別なクラスといくつかの通常のクラスがあります。特別なクラスには別の扱いをする必要があるため、それらを区別したいと思います。これらの特別なクラスはすべてベースです (他のクラスの子ではありません)。

classそれを達成するために、空の を使用して継承を挿入することにより、ソース コード内の特別な es をトークン化していますstruct

必要に応じて、is_base_of<Base,Derived>. 別の方法はtypedef、特別なクラス内で使用することでした:

問題は、Aの子が複数のクラスから継承している場合、あいまいな が存在することtypedefです。

質問: empty を使用した継承などのインターフェイスclass _specialを追加すると、現在のコードになんらかの形で影響を与えますか (たとえば、オブジェクトの構造化、コンパイル エラーなど) ?

0 投票する
1 に答える
77 参照

c++ - オブジェクトのレイアウト

オブジェクトのレイアウトを理解したい。そのため、メンバー変数の順序を変えて実行しました。すべてが期待どおりに行われました。次のシーケンスを期待してください。

出力:

予想通り16。

しかし、Test1からm_aを削除すると、期待されるinput(12)が得られます。

出力:

4ビット境界に正確に整列されている整数を削除すると、なぜ8バイトの違いがあるのですか?

PS:これは実装固有のものだと思います。その実装がどのように行われたか知りたいです:)。プライベートメンバーにアクセスしたいので、これが思い浮かびましたので、オブジェクトのレイアウトを理解しようとしています!!!

0 投票する
2 に答える
119 参照

c++ - C++ のデータ メンバへのポインタの値

非常に奇妙な問題に遭遇しました。これの理由を知っている人はいますか? コードは Visual Studio 2012 でテストされています。

0 投票する
5 に答える
485 参照

c++ - データ メンバーは範囲を形成しますか?

同じ型の連続するデータ メンバーを範囲として扱うことはできますか? 例えば:

0 投票する
6 に答える
1682 参照

c++ - C++ オブジェクトのメモリ レイアウト

多重継承における C++ のオブジェクト レイアウトを理解しようとしています。この目的のために、2 つのスーパークラス A、B、および 1 つのサブクラス C を用意しました。A のフィールド | vfptr | B のフィールド | Cのフィールド。

このモデルを取得しましたが、理解できないゼロがいくつかあります。これが私が試しているコードです

そして、ここに私が得る出力があります:

間のゼロの意味は何ですか? 前もって感謝します!