10

Win32 のHeapAllocを使用する汎用ライブラリを開発しています。

MSDN は、Win32 の HeapAlloc のアラインメントの保証について言及していませんが、過剰なパディングを避けるために、それが使用するアラインメントを知る必要があります。

私のマシン (vista、x86) では、すべての割り当てが 8 バイトに配置されています。これは他のプラットフォームにも当てはまりますか?

4

4 に答える 4

6

驚くべきことに、Google は常に SSE に準拠しているとは限らない証拠を発見しました。HeapAlloc

HeapAlloc() では、サイズに関係なく、すべてのオブジェクトが常に 8 バイトで整列されます (ただし、SSE の場合は 16 バイトで整列されません)。

この投稿は 2008 年半ばのもので、最近の Windows XP がこのバグに悩まされていることを示唆しています。

http://support.microsoft.com/kb/286470も参照してください。

Windows ヒープ マネージャー (すべてのバージョン) では、ヒープ割り当ての開始アドレスが 8 バイトで整列されていることが常に保証されています (64 ビット プラットフォームでは、整列は 16 バイトです)。

于 2010-05-10T20:41:02.887 に答える
2

HeapAlloc 関数は、MSDN ページでアラインメントの保証を指定していませんが、8 バイト アラインメントされたメモリを返すことが保証されている GlobalAlloc と同じ保証が必要であると考える傾向があります (ただし、文書化されていない機能に依存することは悪です)。 ; 結局のところ、Global/LocalAlloc は HeapAlloc の単なるラッパーであると明示的に述べられています (ただし、整列されたメモリを取得するために最初のnバイトを破棄する場合がありますが、その可能性は非常に低いと思います)。

本当に確認したい場合は、GlobalAlloc または VirtualAlloc を使用してください。その粒度はページの粒度であり、通常は 4 KB (IIRC) ですが、この場合、小さな割り当ての場合、大量のメモリが浪費されます。

ところで、C++ の new 演算子を使用すると、指定した型に対してメモリが正しく整列されることが保証されます。

于 2010-05-10T20:52:10.510 に答える
0

アラインメントは、返されたアドレスを任意の型のポインターにキャストできるようになります。そうしないと、アプリケーションでメモリを使用できなくなります。

于 2010-05-10T20:08:58.240 に答える