問題タブ [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.
variant - バリアント型のストレージと配置の問題
boost::variantの代わりに使用するバリアント型を作成しました。Mineは、可能なタイプのリストに現在のタイプのインデックスを格納し、最大のタイプを格納するのに十分なスペースがあるバイト配列にデータを格納するように機能します。
さて、このバリアント型に値を書き込むと、問題が発生します。私は以下を使用します:
クラッシュする行は、データを内部バッファに格納する行です。ご覧のとおり、バイト配列を目的の型のポインターに直接キャストしています。これにより、いくつかの値を書き込もうとすると、アドレス信号が不良になり、バスエラーが発生します。
64ビットシステムでGCCを使用しています。配列のアドレスが64ビットで整列されていることを確認するために、バイト配列の整列を設定するにはどうすればよいですか?(または、このプロジェクトを移植する可能性のあるアーキテクチャに合わせて適切に調整します)。
編集:ありがとうございましたが、間違いはどこかにありました。どうやら、Intelは実際にはアライメントを気にしていないようです。整列されたものはより高速ですが必須ではなく、プログラムはこのように正常に動作します。私の問題は、何かを書く前にデータバッファーをクリアしなかったため、一部のタイプのコンストラクターで問題が発生したことです。ただし、質問に回答済みのマークを付けないので、より多くの人が調整のヒントを教えてくれます;)
c++ - C 構造体のメモリ アラインメント
私は 32 ビット マシンで作業しているので、メモリ アラインメントは 4 バイトである必要があると思います。私はこの構造体を持っているとしましょう:
単純な追加サイズは 6 バイトで、アラインされたサイズは 8 である必要があると思いますが、sizeof(myStruct)
6 が返されます。
ただし、次のように書くと:
単純な追加サイズは 10 バイト、整列サイズは 12 で、今回はsizeof(myStruct) == 12
.
誰かが違いを説明できますか?
c - 64ビットアーキテクチャでアラインメントが16バイトなのはなぜですか?
なぜ8バイトだけではないのですか?
c - Solaris と Linux でのアライメントされていないメモリ アクセスの違い
Linux (x86、32 ビット) でプログラムを書きましたが、すべて正常に動作します。しかし、Solaris (SPARC、64 ビット) で同じソース コードをコンパイルして実行しようとすると、バス エラー (SIGBUS) が発生しました。 gdb からのメッセージは次のとおりです。
fscanf 関数が原因でバグが発生していることが判明し、対応するコード スニップは次のようになります。
基本的に、コンマ区切り値ファイルから情報を抽出し、それらを構造体(レコード)の配列に格納しようとします。たとえば、次のようになります。
レコード構造は次のとおりです。
お気づきかもしれませんが、プラグマ パックを使用して、これら 2 つのマシンのアライメントの違いを回避しようとしました。
c++ - 複数の継承を処理するときにポインタを揃える方法は?
具象クラス A と抽象クラス B があるとします。
A と B の両方から継承し、B を実装する具体的な C を考えてみましょう。
今、私は署名である関数を定義しますvoid foo(B* b);
これは私のコードです。B へのすべてのポインターは A と B の両方であると想定できます。foo の定義では、A へのポインターを取得する方法は? 厄介だが有効なトリックは、次のようにポインターを後方に揃えることです。
Cにはスーパータイプがなく、実際にはCに似た多くのクラスがあり、それらはAとBのみであることに注意してください。私のロジックとこの設計サンプルの両方に自由に質問してください。ただし、質問はポインターの配置のみに関するものです.
gcc - メモリにアラインされたコードとアラインされていないコードの混在
最近 GotoBLAS2 (MacOSX 10.6) をコンパイルして自分のコードにリンクしたところ、あらゆる種類の間違った結果が生じました。GotoBLAS からの不正な読み取りに気付いたので、すべてを valgrind で実行しました。もっと注意深く見てみると、GotoBLAS が -m128bit-long-double アライメント オプションでコンパイルされていることがわかりました。このフラグを使用してコードをコンパイルするとすぐに (長い double はまったく使用しませんが)、すべてが機能し、valgrind のあいまいさなしに正しい結果が得られます。
今私の質問です:
- 同じアライメント フラグを使用して、他のすべてのライブラリ依存関係をコンパイルする必要がありますか?
opencv - OpenCV の cv::Mat と CvMat 行の配置
CvMat
OpenCV (またはその C++ バージョン)の行配置がどのように機能するかを誰かが説明してくれませんかcv::Mat
? たとえば、行列があるとしましょう
のドキュメントによるとCvMat
、行は 4 バイトでアラインする必要があります。つまり、行列の最初の行は 1 つのゼロでパディングし、2 番目の行はオフセット +4 から開始する必要があります)。しかし、このコードをデバッグすると、データは連続しており (つまりcvmat->data
) [1,2,3,4,5,6]
、4 バイトのアライメントは見られません。これはドキュメントのバグですか? or のデータの連続性を想定することは常に安全ですCvMat
かcv::Mat
(行列が別の ofc の一部ではない場合)? または、メモリ アライメントの結果としてデータにギャップが生じる可能性のある特別な構成がいくつかありますか?
java - Java VM は、MT コンテキストでキャッシュラインとメモリのアライメントをどのように処理しますか?
件名によると、効率的な MT コードを開発する際に C/C++ でキャッシュ ライン サイズを見つけてこの問題に対処するのは簡単ですが、Java VM ではこれをどのように対処しますか?
乾杯
c++ - インターリーブされていない保存されたタプルのC++コンテナ
タプルstd::vector
のまたはstd::array
のバリアントを探しています。タプル要素は、たとえば、の場合のようにインターリーブされるのではなく、インターリーブされていない別のメモリ領域に配置されます。std::vector<std::tuple<...>>
この動機は
- アラインメントの制御が向上し、ベクトル最適化のパフォーマンスが向上します。
- OpenGLで低レベルのCPU-GPUデータ転送操作(頂点や色の配列など)をインターフェイスするときに、データ要素を解凍する必要がなくなります。
boost::tuple<>
イテレータは、参照解除されたときにオンザフライで構築して返す必要があります。
このコンテナですべてのSTLメンバー関数を効率的にサポートできるわけではないことを認識しています。たとえば、STLdata()
コンテナメンバー関数は、動的に作成された可変のベクトルコンテナにすべての個別の配列を動的に圧縮し、そのdata()を返す必要があります。
誰かがそのようなテーブルコンテナをすでに構築しましたか?
memory - メモリー・アライン・アクセスは高速ですか?
私の機械語が 32 ビット長で、8 文字の文字列をソートする必要があるとします。
文字を単語にパックすると、アライメントされたメモリアクセスを使用するため、比較が高速になることを読みました。
したがって、この例では、文字列を 4 バイトの 2 つの単語に分割し、各文字列の最初の単語を使用して比較し、それらが等しい場合は、各文字列の 2 番目の単語を確認します。
パフォーマンスは向上しますか?それは速くなりますか?コーディングがより複雑になるので、それは報われますか? 機能する場合、すべての言語で機能しますか?