問題タブ [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 - Cのメモリ開始位置
特定のプロセスのメモリ レイアウトを調べています。各プロセスの開始メモリ位置が 0 ではないことに気付きました。このWeb サイトでは、TEXT は 0x08048000 から始まります。1 つの理由は、アドレスを NULL ポインターで区別することです。他に正当な理由があるかどうか疑問に思っていますか?ありがとう。
c - C のスタック メモリ レイアウト
次のコードをコンパイルして、C でのスタック メモリ レイアウトの理解を確認し、gdb でアドレスを調べます。最下位桁のみを記録します。上位桁は同じです。出力は、
簡単なテスト コードを次に示します。
テスト関数フレームを見ると、次の結果が得られます。
&b: 6808 &a: 6812
&c: 6824 &d: 6828
$rbp: 6832 (フレーム ポインタ)。
私は混乱しています。関数パラメーターは、ローカル変数に対して上位のメモリ アドレスに配置しないでください。誰かがこれを詳細に説明できますか?ありがとう。
編集:次のようにメモリを印刷すると:
私は得た
それは逆順になります。a の終わりと c の始まりの間には 8 バイトのギャップがあります。私はそれがリターンアドレスになると思いますか?
c++ - 構造体/クラスのレイアウトを気にしないためのプラグマはありますか? そうでない場合、なぜですか?
pragma
など、構造体/クラスのレイアウトを制御するためのさまざまな がありますpragma pack
。しかし、私の知る限り、pragma
「レイアウトは気にしない。内部的なもので、コードはそれに依存していない。最適なパフォーマンス/サイズになるように並べ替えてください」と言うわけにはいきません。私の知る限り、それは典型的なケースであり、多くの場合、パフォーマンス/サイズを改善できます。また、プログラマーがパフォーマンスやサイズのために並べ替えるのに十分注意していたとしても、ターゲット アーキテクチャが異なれば最適なレイアウトも異なる可能性があります。
編集:明確にするために、私はメンバーの順序について話しています。パディングはすでに制御可能です。
また、PVS-Studio には関連するメッセージがあります。それが私が話していることです-なぜこれをコンパイラーで行うことができないのpragma
ですか?
c++ - C++11 (ワーキング ドラフト) 標準のレイアウト互換性は弱すぎますか?
もちろん、答えは「いいえ」です。なぜなら、それを書いた人々はそれについて真剣に考えたからです。しかし、私はその理由を知りたいです。
(テンプレートのない) クラスはヘッダー ファイルで宣言されることが多く、それらは個別にコンパイルされるいくつかのファイルに含まれていることを考慮して、これら 2 つのファイルを再検討してください。
file1.c
file2.c
通常、Foo はヘッダー ファイルで宣言され、両方に含まれますが、効果は上記のとおりです。(つまり、ヘッダーを含めることは魔法ではありません。ヘッダーのコンテンツをその行に配置するだけです。)両方をコンパイルして、次のようにリンクできます。
main.cc
これを行う 1 つの方法は、g++ を使用することです。
そして(私のアーキテクチャと環境では)、これは次のように表示されます:8、8、8。sizeofは、file1.cc、file2.cc、およびmain.ccの各コンパイルで同じです
しかし、c++11 標準はこれを保証していますか? 3 つすべての Foo とレイアウトの互換性があると期待しても本当に問題ないのでしょうか? Foo にはプライベート フィールドとパブリック フィールドの両方が含まれているため、c++11 標準 (ワーキング ドラフト) の第 9 節の 7 で定義されている標準レイアウトの構造体ではありません。
標準レイアウト クラスは、次のようなクラスです。
- タイプ非標準レイアウト クラス (またはそのようなタイプの配列) または参照の非静的データ メンバーを持たない、
- 仮想関数 (10.3) も仮想基本クラス (10.1) もありません。
- すべての非静的データメンバーに対して同じアクセス制御 (条項 11) を持ち、
- 非標準レイアウトの基本クラスはありません。
- 最も派生したクラスに非静的データ メンバーがなく、非静的データ メンバーを持つ基本クラスが最大 1 つあるか、または非静的データ メンバーを持つ基本クラスがない。
- 最初の非静的データ メンバーと同じ型の基底クラスはありません。
構造体を使用しているため、徹底的にするために、次のパーは次のように述べています。
標準レイアウト構造体は、class-key 構造体または class-key クラスで定義された標準レイアウト クラスです。標準レイアウト ユニオンは、クラス キー ユニオンで定義された標準レイアウト クラスです。
私の知る限りでは、標準は標準レイアウトの構造体間のレイアウト互換性のみを定義しています (条項 9.2、par 18)。
2 つの標準レイアウト構造体 (条項 9) 型は、同じ数の非静的データ メンバーを持ち、対応する非静的データ メンバー (宣言順) がレイアウト互換型 (3.9) を持っている場合、レイアウト互換性があります。
では、3 つの Foo がすべてレイアウト互換であることが保証されているのでしょうか? さらに重要なことに、その理由は?
コンパイル中に Foo のさまざまなレイアウトを作成する (非決定論的) コンパイラが c++11 コンパイラではないのはなぜですか?
python - Numpy: 高度なインデックス作成の結果を転置
次元に沿って合計する必要があります0
が、実際には行列は巨大であり-1
、メモリレイアウトのために高速な次元に沿って合計することをお勧めします。したがって、結果を転置したいと思います。
それ、どうやったら出来るの?numpy の「高度なインデックス作成」の結果を暗黙的に転置したいと思います。最後に明示的に転置する.T
とさらに遅くなり、オプションではありません。
Update1 : 現実の世界では、高度なインデックス作成は避けられず、添え字が同じであるとは限りません。
Update2 : これがXY の問題ではないことを明確にするために、実際の問題は次のとおりです。
ある確率分布からのX
要素を含む大きな行列があります。x
要素の確率分布は、要素の近傍に依存します。この分布は不明なので、ギブズ サンプリング手順に従って、この分布の要素を持つ行列を作成します。簡単に言えば、行列の初期推定を行ってからX
、行列の要素を反復し続け、各要素を の隣接する値に依存する式でX
更新することを意味します。したがって、行列の任意の要素について、その近傍を取得し (高度なインデックス付け)、それらに対して何らかの操作を実行する必要があります (私の例では合計)。利用したx
x
line_profiler
私のコードでほとんどの時間を費やしている行が、0
ではなく次元に関して配列の合計を取っていることを確認してください-1
。したがって、高度なインデックス付けの結果として、既に転置された行列を生成する方法があるかどうかを知りたいです。
c++ - グローバルのメモリ レイアウト
検討
エンドマーカーが配列の直後に定義されている場合、それは保証されていますか?
データの要素数を手動でカウントする必要はありません。
たまたま最適化オプションがなくても gdb で問題ないように見えますが、それを使用する前に、コンパイラが移動できないことを知っておく必要がありdata_end
ます。できる場合は、代わりにどうすればよいですか。
interface - メモリ レイアウトとは、Go で []T を []interface に変換できないことを意味しますか?
だから私はこれらの2つの記事とこの答えを読んでいます
[]string を []interface に変換できません {}は、メモリ レイアウトを変更する必要があることを示しています。
http://jordanorelli.com/post/32665860244/how-to-use-interfaces-in-goは、根底にあるメモリを理解することでこの質問に簡単に答えられると述べています。
http://research.swtch.com/interfacesは、内部で何が起こっているかを説明しています。
しかし、私の人生では、 []T を [] インターフェイスにキャストできない理由について、インターフェイスの実装に関して、理由を考えることができません。
なぜ?