2017-05-21 5 views
2

私のアプリケーションで私はメモリプールを持っています。私は起動時にすべてのメモリをuint64配列(64ビットマシン)の形式で割り当てます。次に、この配列内に配置newを使用してオブジェクトを構築します。したがって、オブジェクト1は位置pool[0]で開始し、オブジェクト2は位置で始まります。各オブジェクトは、少なくとも128ビットまたはsizeof(uint64)の倍数(割り当てようとする場合にはさらにuint64スロットが必要な場合)に及ぶためです。メモリプール返されたメモリアラインメント

プールから返されたすべてのメモリが正しく整列されると仮定するのは正しいですか?配列内の各uint64はコンパイラによって適切に整列されるためです。もしそうなら、同じ方法で32ビットマシン上でuint32を使用しますか?

+0

これは、使用するコンパイラとメモリアロケータによって大きく異なります。あなたは何を使っていますか?これは、すべてのC++プログラムに対してグローバルに回答することはできません。 –

+0

@LiranFunaro私のターゲットコンパイラはgccとclangです。アロケータは関係ありません。メモリはuint64のグローバルアレイです。 –

+0

特定のアーキテクチャはありますか? –

答えて

2

パディングがないと仮定するのが正しいです。コンパイラは、主に2バイトまたは4バイトの境界にパックします(これは制御できます)。 __alignof__を使用して、特定のターゲットでこれを確認する必要があります。

キーワード__alignof__を使用すると、オブジェクトがどのように整列されているか、通常は型によって必要とされる最小整列について問い合わせることができます。その構文はsizeofと同じです。

ただし、配列が32ビットのオフセットアドレスで割り当てられていた場合、8バイトの割り当ては64ビットにアライメントされないことがあります。

aligned_alloc(8, size)を使用してメモリを割り当ててから、配列をuint64にキャストすることができます。

関連する問題