問題タブ [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 - c構造体の最後のメンバーのパディング
彼らがここhttp://en.wikipedia.org/wiki/Data_structure_alignmentで言ったように、私は常に、「構造の合計サイズが任意の構造体メンバーの最大アライメントの倍数"
したがって、このような構造体の場合、そのサイズは 32 プロセッサで 16 になります。
で、サイズが16ではなく12でビックリ!何故ですか ?誰かがそれに光を当てることができますか?
ところで、システム情報
c - キャッシュラインに合わせて、キャッシュラインのサイズを知る
偽共有を防ぐために、配列の各要素をキャッシュラインに揃えたいと思います。したがって、最初にキャッシュラインのサイズを知る必要があるので、各要素にそのバイト数を割り当てます。次に、配列の先頭をキャッシュラインに揃えたいと思います。
Linuxと8コアx86プラットフォームを使用しています。まず、キャッシュラインサイズを見つけるにはどうすればよいですか。次に、Cでキャッシュラインに合わせるにはどうすればよいですか。gccコンパイラを使用しています。
したがって、たとえば、キャッシュラインサイズを64とすると、構造は次のようになります。
当然のことながら、0-63がキャッシュラインにアラインされていると仮定します。
c++ - さまざまなプラットフォーム/コンパイラ間でのC++メモリアライメントに関するドキュメントはどこにありますか?
C ++でのメモリアライメント、一般的なアプローチ、コンパイラ間の違い、および一般的な落とし穴についての優れた(包括的な)ドキュメントを探しています。トピックの私の理解が正しいかどうかを確認し、何か新しいことを学ぶためだけに。
この質問は、次の構成を使用した別の質問に対する私の回答に触発されています。
これは、メモリアライメントルールに準拠していないと批判されました。ボーナスとして、このアプローチがメモリアライメントの観点から欠陥がある理由を説明できますか?それが機能しない場合の例は高く評価されます。一般的に悪いアプローチだとは思いますが、ネットワークプロトコルの実装でよく使用するので、理論的な質問よりも実用的な質問です。
また、厳密なエイリアシングについては言及しないでください。ここでは別の質問です。
compiler-construction - メモリがバイト アドレス指定可能である場合、アラインメント パディングがあるのはなぜですか?
メモリのすべてのバイトを個別にアドレス指定できるのに、なぜコンパイラは、構造体とそのメンバーがメモリ内の 32 ビット境界に合わせられるように特別な注意を払うのでしょうか? ここで間違っている可能性がありますが、32 ビット システムでは、たとえば 0x0800 から始まる 4 バイトを取得するのは、0x0801 から取得するのと同じくらい高速ではありませんか?
c++ - ずれたデータの操作速度
私の知る限り、CPUは、そのデータムのサイズに等しい境界に位置合わせされたデータムで最高のパフォーマンスを発揮します。たとえば、すべてのint
データのサイズが4バイトの場合int
、CPUを満足させるには、すべてのアドレスを4の倍数にする必要があります。2バイトshort
データと8バイトデータで同じdouble
です。このため、new
演算子とmalloc
関数は常に8の倍数であるため、4と2の倍数であるアドレスを返します。
私のプログラムでは、大きなバイト配列を処理することを目的としたいくつかのタイムクリティカルなアルゴリズムにより、連続する各4バイトをに変換することで計算をunsigned int
進め、このようにして演算をはるかに高速に実行できます。ただし、バイト配列の一部のみを処理する必要がある場合があるため、バイト配列のアドレスは4の倍数であるとは限りません。
私の知る限り、Intel CPUは、位置がずれたデータを適切に処理しますが、速度が犠牲になります。ずれたデータの操作が十分に遅い場合は、プログラムのアルゴリズムを再設計する必要があります。これに関連して、2つの質問があります。最初の質問は、次のコードでサポートされています。
したがって、質問は次のとおりです。
x86、x86-64、およびItaniumプロセッサのOP1と比較してOP2はどれくらい遅いですか(型キャストとアドレス増分のコストを無視した場合)?
クロスプラットフォームのポータブルコードを作成する場合、データアクセスの不整合に関してどのような種類のプロセッサを心配する必要がありますか?(私はすでにRISCのものについて知っています)
c++ - プラットフォームに依存しない方法でアライメントを設定するには?
c++11 標準の最新ドラフトでは、 3.11 章でアラインメントについて説明しています。
後で、章 7.6.1 は整列された構造体 (または変数?) を定義する方法を定義します。
このような構造を定義すると:
クラス A のすべてのインスタンスが 16 バイトにアラインされるということですか?
または、次のコードのようにする必要がありますか?
両方の例が間違っている場合、適切に行うにはどうすればよいですか?
PS私はコンパイラに依存するソリューションを探していません。
winapi - 大規模なアライメントでの Win32 メモリ割り当て
大規模なメモリ領域 (メガバイト) を大きなアラインメント (メガバイト範囲の可能性もあります) で割り当てる必要があります。関数の VirtualAlloc ファミリは、これを行うためのオプションを提供していないようです。
これを達成するために Linux で行うことは、より大きな領域を mmap することです (必要なアライメントを備えた十分に大きな領域が含まれることを保証するのに十分な大きさです)。必要ありません。
例として、4 メガバイトが必要で、1 メガバイトの境界 (つまり、最下位 20 ビットにゼロがある領域の開始) に配置されているとします。私は5メガバイトをmmapします。リージョン 0x44ff000-0x49ff000 を取得するとします。その領域内には、1 メガバイト境界に配置された領域 0x4500000 ~ 0x4900000 が含まれています。次に、0x44ff000-0x4500000 と 0x4900000-0x49ff000 を munmap します。
Win32で同様のことを行うことはできますか? PAGE_NOACCESS で VirtualProtect を使用すると、メモリは解放されますか? より良い解決策はありますか?
.net - データサイズとディスクアクセス
ストレージ上の特定のサイズにデータを調整することには利点がありますか?たとえば、情報を格納するために1バイトまたは4バイトを使用するオプションがある場合、どちらが推奨されますか(ストレージサイズは重要ではなく、最適化のみ)?
この質問をするのは主に、メモリ内の値について考える場合に「重要」であることがわかっているためです(したがって、たとえば、このサイトの別の質問のように、.NETブール値が4バイトである理由)。
それは問題ではないと思いますが、私は.NET Framework(具体的にはC#)を使用しています。
c - アラインメントのために C 構造体の穴を見つける
gcc または clang (またはその他のコンパイラ) に、構造体に穴 (メモリ配置に関する) があるかどうかに関する情報を吐き出す方法はありますか?
ありがとうございました。
ps: 他に方法があれば教えてください。
c - 8に揃える理由は何ですか?
上記はMySQLソースから抜粋したもので、
なぜに合わせる必要があるの8
ですか?