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

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

c++ - 可変サイズのクラス - C++

このように定義されたクラスであるクラスを見てきました..

静的ファクトリ関数には、次の実装があります。

私が理解している限り、この関数は新しい配置を使用してこのクラスを拡張しています。

メンバーが1つしかなく、ヒープに割り当てられているため、これは安全ですか?

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

c# - C# 構造体のメンバーの順序が正しくない

私はパケットを構造体に入れるTCPクライアントを持っています

パケットを構造体に入れるために使用するコードは次のとおりです。

さて、先に進む前に、このプロジェクトを C++ から C# に翻訳していることをお伝えしなければなりません。

これが問題です:

tPacket_5000_E の最後の 3 つのメンバーは Int32 (私も UInt32 を試しました) で、これは C++ の DWORD です。Int32 ではないこれら 3 つのメンバーの前の値は、C++ の値と同じです (C++ プロジェクトと C# プロジェクトの両方に同じパケットを挿入します)。

ただし、これらの 3 つのメンバーは異なる値を持っています。

C++ の値は (正しい):

  1. シード数:0x00000079
  2. シードCRC:0x000000d1
  3. シードセキュリティ:
  4. -[0]:0x548ac099
  5. - 1 :0x03c4d378
  6. -[2]:0x292e9eab
  7. -[3]:0x4eee5ee3
  8. -[4]:0x1071206e

C# の値は (正しくありません):

  1. シード数:0xd1000000
  2. シードCRC:0x99000000
  3. シードセキュリティ:
  4. -[0]: 0x78548ac0
  5. - 1 : 0xab03c4d3
  6. -[2]: 0xe3292e9e
  7. -[3]: 0x6e4eee5e
  8. -[4]: 0x00107120

両方のアプリケーションのパケットは等しい

詳細については、ここをクリックしてください

構造体の最後の 3 つのメンバーが異なるのはなぜですか?また、それらを修正する方法は?

前もって感謝します!

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

c++ - 仮想関数と多重継承の場合のオブジェクト レイアウト

最近のインタビューで、仮想関数と多重継承を伴うオブジェクト レイアウトについて尋ねられました。
多重継承を伴わずに実装する方法 (つまり、コンパイラが仮想テーブルを生成する方法、各オブジェクトに仮想テーブルへの秘密のポインターを挿入する方法など) のコンテキストで説明しました。
私の説明には何かが欠けているように思えました。
ここに質問があります(以下の例を参照)

  1. クラス C のオブジェクトの正確なメモリ レイアウトを教えてください。
  2. クラス C の仮想テーブル エントリ。
  3. クラス A、B、および C のオブジェクトのサイズ (sizeof によって返される) (8、8、16 ??)
  4. 仮想継承を使用するとどうなりますか。確かに、サイズと仮想テーブルのエントリが影響を受けるはずですか?

コード例:

ありがとう!

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

delphi - Xの動的配列のDelphi動的配列のメモリレイアウトは何ですか?

C#からDelphiDLLのプロシージャを呼び出そうとしています。このプロシージャは、呼び出し元がを事前に割り当てて入力することを想定しており、その結果を返す手段として要素をarray of array of TSomeRecord操作します。TSomeRecordしたがって、Xの配列のDelphi動的配列を手作りする必要があります。
ここで、動的配列は動的配列の最初の要素へのポインターで構成され、その最初の要素には参照カウントと長さが含まれていることがわかりましたarray of X。 (要素の数)先頭に追加された配列(両方とも32ビット整数)、および要素がインラインで連続して格納されるため、全体がメモリ内で次のようになります。

rrrrを使用して、参照カウント、llllの長さ、0123の要素、および^ポインターが指す場所。これは裏付けられます。私はそれをテストしました、そしてそれは働きます。多次元動的配列の場合、inの
代わりに使用できると仮定しました。言い換えると、外側の次元は、次のように、動的配列(へのポインター)の動的配列にすぎません。 array of YXarray of X

ここで、要素0000、1111などは、独立して割り当てられた動的配列への32ビットポインタになりました。ただし、このようにすると、問題が発生したためにアクセス違反が発生します。これは明らかに、Delphiが私にそれを期待する方法ではありません。誰かが私にこれを行うことになっている方法を説明できます

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

c - C の構造体メモリ レイアウト

私は C# のバックグラウンドを持っています。私は C のような低レベル言語の初心者です。

C# では、structのメモリはデフォルトでコンパイラによって配置されます。コンパイラは、データ フィールドの順序を変更したり、フィールド間に追加のビットを暗黙的に埋め込むことができます。そのため、正確なレイアウトのためにこの動作をオーバーライドするために、特別な属性を指定する必要がありました。

struct私の知る限り、Cはデフォルトでaのメモリレイアウトを並べ替えたり整列したりしません。ただし、見つけるのが非常に難しい小さな例外があると聞きました。

C のメモリ レイアウト動作とは何ですか? 何を並べ替え/整列する必要がありますか?

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

linux - Linuxバイナリの仮想メモリアドレスが0x8048000で始まるのはなぜですか?

Ubuntu x86システムでのELFバイナリの逆アセンブルcode(.text)セクションが仮想アドレス0x8048000から始まり、下位のメモリアドレスがすべて使用されていないように見えることに気づかずにはいられませんでした。

これはかなり無駄なようで、Googleが明らかにするのは、STACK_TOPを含む民間伝承か、nullポインターの逆参照に対する保護のいずれかです。後者の場合は、128MBのギャップを残す代わりに、単一のページを使用することで修正できるようです。

だから私の質問はこれです-なぜレイアウトがこれらの値に固定されているのかについての決定的な答えはありますか、それとも単なる任意の選択ですか?

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

c++ - g++ コンパイラを使用した C++ オブジェクトの印刷レイアウト

g++ コンパイラまたはその他の手段を使用して C++ オブジェクトのレイアウトを出力する方法はありますか。簡単な例 (int が 4 バイトと仮定)

したがって、出力は次のようになります

オブジェクトのレイアウト (私の場合は仮想マシン コード) を理解しておくと役立ちます。

前もって感謝します。

よろしく、ザヒール

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

c++ - クラスのオブジェクト(単一/多重継承を使用)にはいくつのvptrがありますか?

clas(child)がbase1とbase2を複数継承する基本クラスを持つ単一の継承を持つオブジェクトに通常必要なvptrの数。オブジェクトが単一の継承と多重継承のカップルを持っている場合に、オブジェクトが提供したvptrの数を識別するための戦略は何ですか。標準ではvptrsについて指定されていませんが、実装が仮想関数の実装をどのように行うかを知りたいだけです。

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

vector - ベクトルのメモリ レイアウト

誰かがに格納されているデータのメモリ レイアウトを説明できますかvector<bool>?

メモリはアドレスから上に向かってどのようなレイアウトを持っています&myVec[0]か? エンディアンに依存しますか?格納されたすべての値のメモリは連続していますか? vector<bool>(実際にはブール値を保存しないことは承知しています)。vector<bool>memcopy を使用して aの内容をファイルにダンプして、値のビットマップを取得できますか?

「何のために必要なのですか」のような質問や、ビットセットやブーストの使用などの提案はしないでください。

的確な説明ありがとう

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

c - データセグメントのアドレス範囲を見つける

プログラミングの演習として、C でマーク アンド スイープ ガベージ コレクタを作成しています。データ セグメント (グローバルなど) をスキャンして、割り当てられたメモリへのポインタを探したいのですが、範囲を取得する方法がわかりません。このセグメントのアドレス。どうすればこれを行うことができますか?