問題タブ [memory-alignment]
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 - スタックを整列させるとはどういう意味ですか?
私は高レベルのコーダーであり、アーキテクチャーは私にとってかなり新しいので、ここでアセンブリに関するチュートリアルを読むことにしました。
http://en.wikibooks.org/wiki/X86_Assembly/Print_Version
チュートリアルのはるか下で、Hello World!を変換する方法について説明します。プログラム
同等のアセンブリコードが与えられ、以下が生成されました。
行の1つについては、
説明は:
このコードは、ESPを0xFFFFFFF0で「and」し、スタックを次に低い16バイト境界に揃えます。Mingwのソースコードを調べると、これは「_main」ルーチンに表示されるSIMD命令の場合であり、整列されたアドレスでのみ動作することがわかります。ルーチンにはSIMD命令が含まれていないため、この行は不要です。
この点はわかりません。スタックを次の16バイト境界に揃えることの意味と、それが必要な理由について誰かに説明してもらえますか?そして、andl
これをどのように達成していますか?
c++ - 「アラインされたポインター」とは正確には何ですか?
アラインされたポインターが実際に何を意味するのか誰か教えてください。
c++ - InterlockedIncrement 関数の正しいメモリ配置でヒープから割り当てる方法は?
このコードは機能しているように見えますが、InterlockedIncrement 関数を正しく使用していますか? m_count の正しいメモリ アラインメントは、私の主な関心事です。x86-64 システムを使用していて、64 ビット アプリケーションをコンパイルするとします (問題がある場合)。ところで、私の実際の目的では、 m_count を volatile long として宣言してから InterlockedIncrement(&m_count); を使用することはできません。ただし、ヒープ内のデータへのポインターである必要があります。
c++ - ユニオンでのメモリアライメントの問題
このタイプのオブジェクトをスタックに作成した場合、このオブジェクトのメモリが適切に配置されるという保証はありますか?
スタックにcharbytes[4]を作成し、それを整数にキャストしようとすると、アライメントの問題が発生する可能性があります。ヒープ内に作成することでその問題を回避できますが、ユニオンオブジェクトにそのような保証はありますか?論理的にはあるはずですが、確認したいと思います。
ありがとう。
c++ - #pragma pack in C++
なぜC++#pragma pack
で構造体が必要なのですか? typedef
特に、ネットワーク通信でこれらの構造を使用している場合。
windows - Windows x64 の 44 ビット仮想メモリ アドレス制限の背後にある
http://www.alex-ionescu.com/?p=50 .
上記の投稿を読みました。著者は、Windows x64 が単一リンク リストの例で 44 ビットの仮想メモリ アドレスのみをサポートする理由を説明しています。
最初の犠牲は、シーケンス番号のスペースを 16 ビットではなく 9 ビットに減らし、リストが達成できる最大シーケンス番号を減らすことでした。これでもポインター用に 39 ビットしか残っていません。これは 32 ビットよりも平凡な改善です。割り当て時に構造体を強制的に 16 バイト アラインすることで、最下位ビットを常に 0 と見なすことができるようになったため、さらに 4 ビットを獲得できました。
ああ、私は理解できません。
「割り当て時に構造体を強制的に 16 バイト アラインすることで、最下位ビットを常に 0 と見なすことができるようになったため、さらに 4 ビットを獲得できました。」意味?
c - 構造体に割り当てられたメモリ
私は構造を持っています
a
は整数変数なので 4 バイト、c
は char 変数なので 1 バイト、合計 5 バイトです。
しかし、印刷すると8 バイトsizeof(obj)
と表示されます。
理由は何ですか?
c - calloc(1000, 23) と言った場合、23 は 24 に「切り上げ」ますか? それとも32まで?
私が疑問に思っていたのは、ほとんどの実装でcalloc
はサイズもアライメントとして扱い、サポートされている次の粒度に切り上げるのですか?
もしそうなら、それらは次の 2 の累乗に切り上げますか、それとも次の 8 または 16 の倍数に丸めますか?
パラメータを同じに保つ場合calloc
、それはどのように機能しますか? あなたのデータは整列されていませんか?
ありがとうございました!
c++ - C/C++ でのバイナリ メッセージ ストリームの解析
バイナリ プロトコル (Javad GRIL プロトコル) のデコーダーを作成しています。これは、次の形式のデータを含む約 100 のメッセージで構成されています。
フィールドは、ANSI でエンコードされた 2 進数で、ギャップなしで相互に続きます。このようなメッセージを解析する最も簡単な方法は、バイトの入力配列を適切な型にキャストすることです。問題は、ストリーム内のデータがパックされている、つまりアライメントされていないことです。
x86 では、これは を使用して解決できます#pragma pack(1)
。ただし、これは一部の他のプラットフォームでは機能しないか、位置合わせされていないデータをさらに処理するためにパフォーマンスのオーバーヘッドが発生します。
もう 1 つの方法は、メッセージの種類ごとに特定の解析関数を作成することですが、前述したように、プロトコルには何百ものメッセージが含まれます。
もう 1 つの方法は、Perlunpack()
関数のようなものを使用して、メッセージ形式をどこかに保存することです。たとえば、 を#define MsgDataFormat "CfffC"
呼び出すことができますunpack(pMsgBody, MsgDataFormat)
。これははるかに短いですが、それでもエラーが発生しやすく、冗長です。さらに、メッセージには配列を含めることができるため、形式がより複雑になる可能性があるため、パーサーは遅く複雑になります。
一般的で効果的な解決策はありますか?この投稿を読んでグーグルで検索しましたが、より良い方法が見つかりませんでした。
おそらくC++には解決策がありますか?
c++ - C/C++ ポインター、ptr+1 = ptr +1 バイトまたは ptr+1*sizeof(pointer_type)?
持つ
my_ptr は、ptr の後の 1 バイトを指しますか、それとも ptr の後のバイトを指しsizeof(any_type)
ますか? 配置オプションが答えにどのように影響するか? 署名された/署名されていないタイプでは異なりますか?