2017-02-10 7 views
-1

私は常に、mallocが、Visual Studioとgccの両方を使って64ビットシステム用に16バイトのアドレスを割り当てられたメモリブロックを返すと仮定してきました。しかし、私はこの問題に関するいくつかの矛盾する記事を読んできました。 MSDNのサイトはこれではっきりしていますが、GNUのドキュメントはもっと「微妙な」ものです。64ビットプラットフォーム上で割り当てられたメモリブロックのバイトアラインメントは何ですか?

どのような説明が最も役立ちます。ここで

グレート答え:

Aligned memory management?

+1

それは役に立ちますか? https://www.gnu.org/software/libc/manual/html_mono/libc.html#Aligned-Memory-Blocks – Milack27

+1

gccは標準ライブラリを提供していません。 'glibc'のドキュメントを読むべきです。しかし、実際の問題は、なぜあなたはまったく気にしますか? 'malloc'は、ブロック戻り値があなたのプラットフォームの任意のデータ型に対して適切に揃っていることを保証します。これで十分でない場合は、 'malloc'だけでは適切でないか、あるいはあなたのデザインを再考する必要があります。そして:あなたはどの文書を読みましたか? **具体的な**は明確ではありませんか? 「もっとニュアンスがある」とはどういう意味ですか? – Olaf

+0

@Olaf私たちは現在、64バイト(512ビット)のベクトル型を持っていますので、「あなたのプラットフォームの任意のデータ型のために整列されています」は非常に楽観的です。マイクロソフトは、 'malloc'を整列していないという点でユニークです。 – Potatoswatter

答えて

1

mallocmax_align_t(C11 6.2.8)のアラインメントである基本アライメント(C11§7.22.3)とのポインタを返します。これはオペレーティングシステムによって異なり、WindowsではSSEには不十分です。

various optionsがありますが、それがSSEの場合は、_mm_malloc_mm_freeを呼び出すのがよい方法です。必要に応じて、マクロを使用して、これらの名前を_aligned_mallocなどの適切なプラットフォーム固有の機能にマップします。

+0

downvoteありがとう。これのどの部分が偽ですか? – Potatoswatter

+0

プラットフォームの詳細に頼るのではなく、標準関数 'aligned_alloc'を使用してみませんか?基本的なアライメントは 'max_align_t'を保証するものではありません。これは単なる最低保証アラインメントです。 – Olaf

+0

@Olaf C11であり、すべてのプラットフォームベンダーがそれに乗っているわけではないので。 – Potatoswatter

0

アラインメントは、どのような目的にも適していることが保証されています。これは通常、8バイトのアライメントを意味します。しかし、新しいコンパイラが出てきたら、それは変わる可能性があります。メモリ割り当てアルゴリズムの仕組みのため、大きな割り当てはページの境界に合わせることもできます。

+0

これはニュアンスを意味しています。 gccとVSを使用して64ビットマシンで経験したすべての経験は、ダブルワードまたはqaudワードタイプで16バイトに整列されています。 – cdcdcd

関連する問題