私は本GameEngineArchitectureの助けを借りてメモリマネージャに取り組んでいます。現時点では、(本とWebで)メモリアライメントについて読んでいますが、クラスでアライメントがどのように正しく使用されているかわかりません。私はメモリアライメントの概念を理解しています(たとえば、4バイトのデータチャンクは0x0、0x4、0x8、または0xCで終わるアドレスに配置する必要があります)がallocateAligned()
、本の関数には、アライメントはパワーでなければならないというコメントがあります2つの。int
2つの´と1つの´を持つクラスがある場合、そのクラスは12バイトの大きさであると教えてくれますchar
。sizeof(classs)
それで、あなたはアライメントとして32を渡しますか?それはメモリの無駄ではなく、おそらく断片化につながるのではないでしょうか?
私の質問は、クラスを正しく整列させる必要がある方法です。それをより詳細に説明できますか(121バイトなどのより大きなデータチャンクを整列させたい場合はどうなりますか)、より大きなチャンクを整列させることは理にかなっていますか(私が正しく知らされていれば、プロセッサは1回の呼び出しで8バイトしかフェッチしません)?
2 に答える
タイプの配置は、タイプのサイズより大きくすることはできません。これは、配列では要素間にパディングがないためです。
ただし、同様に重要なのは、タイプの配置がタイプのサイズよりも小さい場合があることです。
クラスタイプを考えてみましょう。3つのメンバー、2つの4バイト整数と1つの2バイト整数があります。4バイト整数のアラインメントが4バイトで、2バイト整数のアラインメントが2バイトであると仮定します(これは一般的です)。この場合、クラスタイプのアラインメントはわずか4バイトです。これは任意の4バイト境界に配置でき、その各メンバーは正しく整列されます。
これが、クラスタイプに2バイトのパディングがある理由です。12は4で均等に割り切れますが、10はそうではありません。クラスにパディングがない場合、そのサイズは10バイトのみになり、要素の配列では、オブジェクトの半分がずれます。
タイプの配置は、そのサイズより小さくすることも、大きくすることもできません。典型的な32ビット実装では、
struct X {
int a;
int b;
char c;
};
おそらく持っているだろうsizeof(X) == 12
とalignof(X) == 4
。明らかに、4バイトごとにオーバーラップするため、4バイトごとにすることはできませんX
が、アラインメントとは、、、、およびがすべて、を開始する可能性のある場所であること0x1000
を意味します。0x1004
0x1008
0x100c
X
によって返される型サイズsizeof
は常に配列の倍数であることに注意してください。これはsizeof
、配列要素間のバイト数を指定するためです。配列の最初のエントリを整列させたくないが、2番目のエントリは整列させたくない場合があります。