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

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

c++ - 配列要素の命名、またはユニオン内の構造体と配列

次の構造体を検討してください。

WinApi の IPAddress 構造体で似たようなものを見たように思えます。アイデアは、配列コンポーネントをインデックスと名前の両方で使用できるようにすることです。次に例を示します。

C++ 標準では、POD 構造体の先頭に「空の」スペースがないことが保証されています。つまり、要素 x は Endpoint 構造体の先頭に配置されます。これまでのところ良い。xしかし、 and y、またはyandなどの間に空のスペースやパディングがないという保証はないようですz。ただし、C99標準はチェックアウトしていません。

問題は、Endpoint 構造要素間に空のスペースがある場合、アイデアが機能しないことです。

質問:

  1. これが C または C++ のいずれかで機能するという保証はないというのは正しいですか。

  2. これは、既知の実装で実際に機能しますか? つまり、これが機能しない実装を知っていますか?

  3. 同じ考えを表現するための標準的な(コンパイラ固有ではない)方法はありますか?C++0x のアライメント機能が役立つのではないでしょうか?

ところで、これは私が製品コードで行っていることではありません。心配しないでください。前もって感謝します。

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

c - アラインされたメモリのプリフェッチ

処理されたデータ構造の 64 バイト アラインメントを必要とするスレッド化された C コードがあります。このアライメントは、gcc __builtin_prefetch などのプリフェッチ命令とどのように相互作用しますか? プリフェッチの効果は、アラインされていない配列を使用する場合と同じですか?

整列された配列を取得するために memalign を使用していることに注意してください。

ありがとう。

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

c++ - コンパイラー (GCC) のベクトル化を容易にするための C および C++ でのヒープ配列のアライメント

std::vector私は現在、その.xml ファイル内multi-resolution pyramidの要素のstd::vector.

ここでの重要な問題は、ピラミッドの作成を (GCC) auto-vectorizableにしたいということです。

std::vector と私の解像度ピラ​​ミッドに内部的に格納されているすべてのデータ配列は、すべて標準の new または allocator テンプレート引数を使用してヒープ上に作成されます。ベクトル化が最適なアラインメント (通常は 16) で要素 (配列) (ブロック) を操作できるように、コンパイラーがデータに特定のアラインメントを強制するのを助けることができる方法はありますか?

そのため、カスタム アロケーター AlignmentAllocatorを使用していますが、GCC 自動ベクトル化メッセージの出力では、式を含む144 行目でアライメントされていないメモリが引き続き要求されます。std::mr_vector::construct_pyramidmulti_resolution.hpp

次のように

GCC が指す領域が必要なアラインメント (この場合は 16) を持っていることを確認できるように、ポインタのアラインメントをどうにかして (強く) 型指定できますか?memaligndata()

/あたり

mr_vectorのテンプレート クラスのコードmulti_resolution.hpp:

カスタム アロケータAlignmentAllocatorのコードは次のallocators.hppとおりです。

0 投票する
9 に答える
171 参照

c - マロックよりも多くの文字を書く。なぜ失敗しないのですか?

なぜ次のことが機能し、ある種のセグメンテーション違反をスローしないのですか?

ただし、追加すると

strcatは割り当てられたよりも多くのメモリを使用するため、この呼び出しは失敗するべきではありませんか?したがって、すべきではありません

また、16バイトを解放しようとするため失敗しますが、26バイト( "/ usr / bin / 012RANDOMBUNNIES \ 0")を使用しましたか?

よろしくお願いします!

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

c++ - 初期化リストのfloat*からdouble[]を設定します

おおよそ次のようなクラスがあります。

コンストラクターの場合、それが(次元dimの)値void* dataの配列を指していることを私は知っています。ここで、そのコンストラクターの初期化リストで-arrayを(できれば)float初期化したいと思います。vals

さらに悪いことに、指摘されたフロートは必ずしも適切にメモリ整列されている必要はありません。

どうすればこれを効率的に行うことができますか?


編集1

以下で行われる議論に関して、最初に私の設計の優先順位を述べさせてください。これは、私にとって最も重要な問題に集中するのに役立つかもしれません。

  1. 悪いメモリアライメントに対処する
  2. パフォーマンスの観点から、操作をできるだけ少なくします。

正直なところ、高速アルゴリズムを機能させるためにコンストラクター本体が必要な場合、これは私にとっても問題ありません。焦点は生の力にあります。

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

c++ - 構造体メンバーと静的変数の配置

Interlocked* 関数呼び出しで使用されるメンバーを持つクラスを持つレガシー コードがいくつかあります。

私が持っているいくつかのメンバー変数が 4 バイト境界に配置されていることを確認したい (InterlockedIncrement で使用するには、http://blogs.msdn.com/b/oldnewthing/archive/2004/08/30/222631.aspxを参照) .

VS 2010 の構造体メンバーのデフォルトのアラインメントを指定する決定的なものは見つかりません。実験的に、デフォルトのパッキングを変更せずに構造体を 4 バイト アラインメントに違反させることはできませんでした。私が知ることができたのは、デフォルトのパッキングが 8 バイトであり、どこでもそれを使用していることだけです。

http://blogs.msdn.com/b/oldnewthing/archive/2004/08/30/222631.aspx

私が知りたいのは、Interlocked* 呼び出しで使用されるすべての変数に __declspec(align(4)) を追加する必要があるかということです。

編集:パッキングとその方法について知っています。具体的でなくてすみません。また、CRT はすべての構造体を割り当て、デフォルトで 8 バイトのパッキングが与えられた場合、すべての構造体メンバーがデフォルトで 4 バイト境界に整列されるようにしますか?

32 ビットの int 静的変数はデフォルトで整列されますか? VS に関するドキュメントを探していますが、デフォルトを説明するドキュメントを見つけるのに苦労しています。

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

c++ - alignas(T) をシミュレートするにはどうすればよいですか?

タイプのオブジェクトの基になるメモリとして使用される配列がありますT:

オブジェクトに対してmemoryが正しく配置されていることを確認するにはどうすればよいですか? TC++0x では、次のように言えます。

しかし、Visual Studio 2010 はその特定の機能をまだサポートしていません。

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

c - memory alignment 64bits

I've been playing with C today, and something I never had the chance to play with, that is use a struct with pointers to functions...well all went good, until I started to get some strange bug, when I was cleaning the whole thing (BTW: I was compiling in x86_64 arch, in a Mac) Looking and looking I figured out that is the memory alignment, in the node_vtable struct.

In i386, it works fine..no issues whatsoever. However, as I said in x86_64, it doesn't work.

Now, I fixed this moving the pointer node * (*create_node) (linked_list *, float, int, int ); to the end of the struct, as that one has a size of 24 bytes, which is the largest in that struct. However, I really think that there is for sure a more elegant solution, and also I am looking for a clear explanation. Hence, if someone can give a hint or some explanation, that would be great ;) ....as my brain now is really stuck :)

The whole code:

Cheers

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

c - アラインされたアトリビュートとパックされたアトリビュート

私は 16 ビット PIC 用のファームウェアに取り組んでおり、C (Microchip C30 コンパイラ) で書いています。デバイスが外部デバイスから長いバイト リストを受信し、それらのバイトを構造体にコピーしようとしています。構造は次のように定義されます。

構造内の合計バイト数が奇数になると、プログラムがフリーズして AddressError サービス ルーチンに引っかかるという奇妙な問題がありました。構造体に余分なバイトを追加するだけで問題を解決できますが、それは応急処置のようです。

コンパイラが変数の間にフィラー バイトを挿入しないようにしたかったので、packed 属性を構造体に配置しました。その場合、受信した文字配列からコピーすると、構造体の値が正しくなくなります。

また、aligned という属性があることも知っています。整列は構造体の先頭を偶数バイトに整列させるだけですか、それとも構造体のすべての項目を偶数バイトに整列させますか? ここで、aligned 属性が必要だと思いますか? この構造体にaligned属性を追加する場合、データを送信しているデバイスの構造体にも追加する必要がありますよね? 現時点では、どちらも上記とまったく同じ方法で定義されています。

整列された属性を追加する場合、packed 属性を削除する必要がありますか? 彼らは基本的に反対のことをしていませんか?

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

c++ - アラインメントの問題を回避しながら、ODBC で任意の結果セットの行単位のバインドを移植可能に実装するにはどうすればよいですか?

SQLクエリを取得して実行し、結果セットのすべての列を行単位のバインディングを使用してSQL_C_WCHARとしてバインドするクラスがあります。

今私が行う方法は、char のベクトルを割り当て、次のように SQLBindColumn を与えるポインターを決定することです。

  • 列 1 のバッファ = &vec[0]
  • 列 1 の長さインジケータのバッファ = &vec[0] + (sizeof(SQLWCHAR) * 列 1 の長さ)
  • 列 2 のバッファ = &vec[0] + (sizeof(SQLWCHAR) * 列 1 の長さ) + sizeof(長さインジケータ)
  • 列 2 の長さ標識のバッファー = &vec[0] + (sizeof(SQLWCHAR) * 列 1 の長さ) + sizeof(長さ標識) + (sizeof(SQLWCHAR) * 列 2 の長さ)

等々

これにより、(SPARC で) アラインメントの問題が発生しています。パディングを追加する必要があることはわかっていますが、移植可能な量を計算する方法がわかりません。