問題タブ [memory-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++ - 基本クラスの仮想継承と空のvtable
このコードがあります:
一部のクラスが仮想的に継承されると、Derivedクラスの空のvtableが作成されることを読みました。したがって、メモリレイアウトは次のようになります。
そしてそれは12バイトです。問題は、仮想メソッドがない場合、この空のvtableの目的は何であり、どのように使用されるのかということです。
linux - 実行可能ファイルの変数をメモリセグメントにマップします
Linuxには、実行可能ファイル内のさまざまな変数を対応するメモリセグメントにマップするツールがありますか。
たとえば、実行可能ファイルに初期化されたグローバル変数がある場合、ツールは、変数が実行可能ファイルのセグメントにint x = 10
属することを、以下に示すような形式で表示する必要があります。.data
x .data
c++ - xcodeでのオブジェクトバイトアラインメント
Xcodeでクラスインスタンスのコンパイル時のバイトアラインメントを取得する方法はありますか?Visual Studioには、クラスレイアウトを出力ウィンドウにダンプするフラグ(/ d1reportSingleClassLayoutXXX、XXXはクラス名)があります。Xcodeに同様のフラグ/関数はありますか?
llvmを使用することを除いて、このように。
clr - PInvoke で Numeric.Complex を使用しても安全ですか? (LayoutKind.Sequential はありません)
アンマネージ PInvoke シナリオで System.Numerics.Complex を使用したいと考えています。ILSpy を使用して、LayoutKind.Sequential 属性が割り当てられていないことに気付きました。
共通メモリ レイアウトを期待するネイティブ関数に変換せずに、Complex[] 配列へのポインターを与えることは安全ですか? それとも、何らかの理由で CLR がその実数と虚数の属性を乱す可能性はありますか?
c++ - virtual キーワードによって派生クラスのサイズが大きくなるのはなぜですか?
私は2つのクラスを持っています.1つは基本クラスで、もう1つはそれから派生したものです:
ここでの答えは 16 です。しかし、代わりに非仮想パブリック継承を行うか、基本クラスを非ポリモーフィックにすると、答えは 12 になります。
また
どちらの場合も、答えは 12 です。
1番目と他の2つのケースで派生クラスのサイズに違いがある理由を誰かが説明できますか?
(誰かが本当にこれを必要とする場合、私はコード::ブロック10.05に取り組んでいます)
c - テキストエリアのサイズ
次のプログラムを検討してください。
次のコマンドを実行すると:
出力は次のようになります。
テキスト領域にはプログラムの実行可能な命令が含まれているため、出力でテキスト領域のサイズが 960 と表示されるのはなぜですか。これは、数えることができる限り、命令のサイズに対して大きすぎます。
c++ - 継承の C++ メモリ レイアウト
2 つのクラスがあり、一方が他方から継承され、子クラスに関数のみが含まれている場合、メモリ レイアウトは両方のクラスで同じになりますか?
例えば
Derived
コンパイラはデータ メンバーの順序を変更できないことを読みましたが、クラスで多重継承は必要ありません。メモリ レイアウトが同じにならない状況はありますか? (クラスには複数の継承が必要な場合がありますBase
)
c++ - 基本クラスがポリモーフィックではなく、派生クラスである場合の「this」アドレスの不一致
このコードがあります:
出力:
ただし、関数 'fun' が Derived クラスで virtual に変更された場合:
次に、「this」のアドレスは両方のコンストラクターで同じではありません:
もう 1 つは、クラス Base がポリモーフィックである場合です。たとえば、別の仮想関数をそこに追加しました。
次に、両方の「this」のアドレスが再び一致します。
問題は、ベース クラスがポリモーフィックではなく、派生クラスがポリモーフィックである場合に、ベース クラスと派生クラスで「この」アドレスが異なるのはなぜですか?
c++ - 複数の仮想継承における仮想テーブルとメモリレイアウト
次の階層を検討してください。
インスタンスの正確なメモリレイアウトは何ですか?
C
含まれているvptrはいくつあり、それぞれが正確に配置されていますか?Cの仮想テーブルと共有されている仮想テーブルはどれですか?各仮想テーブルには正確に何が含まれていますか?ここで私がレイアウトをどのように理解するか:
ここで、はを含むインスタンス
AptrOfBx
へのポインタです(継承は仮想であるため)。 あれは正しいですか?どの機能が指しているのですか?どの機能が指しているのですか?A
Bx
vptr1
vptr2
次のコードが与えられた
f
なぜすべての印刷の呼び出し33
?
c++ - ユニオン内のビットフィールドのアライメント
次のコードがメモリにどのように配置されるかについて、私は少し戸惑っています。
Linux 上の gcc 3.3、4.3、または 4.6 (考えられる特別なオプションなし - 4.6 では "-Wall -g" のみ) では、構造体のサイズは常に 4 です。
構造体に unsigned value:24 があり、誰かが共用体を追加して、構造体のサイズを誤って 3 バイトから 4 バイトに増やした、似たようなコードがいくつかありました。ユニオンを「パック」として定義しようとすると、同じことが起こります。サイズはまだ 4 です。この動作は C++ 仕様どおりですか? 説明は何ですか?
後で編集:「C 仕様」を「C++ 仕様」に置き換えました。