2

たとえば、int ではなく int32、uint16 など、明示的な幅を持つ型のみを使用するとします。

A byte will always take 8 bits and will be 8 bit aligned
A short will always take 16 bits and will be 16 bit aligned
An int will always take 32 bits and will be 32 bit aligned
A long int will always take 64 bits and will be 64 bit aligned
A float will always take 32 bits and will be 32 bit aligned
A double will always take 64 bits and will be 64 bit aligned

--- また、オプションでこれら 3 つが最適に機能するのは、次の場合です。

A 64bit SIMD datatype will always be 8 byte aligned    
A 128bit SIMD datatype will always be 16 byte aligned
A 256bit SIMD datatype will always be 32 byte aligned

- - そして最後に:

A cache page will always be multiple of 32 bytes  // e.g. 32 or 64 bytes

もちろん、すべてのハードウェア プラットフォームを意味するわけではありません。x86 /x64 と ARM v7/v8 のみに関心があります。

4

4 に答える 4

0

プラグマ、コンパイラ フラグ、またはポインター演算を使用して、物事が適切に整列されていない状況に陥る可能性は十分にあります。

選択を ARM と x86 に制限する場合、ヒステリックな歴史的理由からMS コンパイラlongが 32 ビットを使用するという事実を除けば、サイズは正しいです。

キャッシュの「ラインサイズ」は必ずしも 32 バイトではありません。私は、16 バイトのキャッシュ アライメントを備えた古いプロセッサで作業しました。これは常に 2 nであり、現在 32 バイトは確かに非常に一般的です。

編集:コンパイラを書いているというコメントの1つに気づきました。私は今はそれについて心配する必要はありません (おそらくあなたは始めたばかりです) が、ある時点で__attribute__(packed)or#pragma pack(n)および 関連するビットを考慮する必要があるかもしれません. たとえば、ファイルから直接データを読み取るための適切なレイアウトを提供するために、この種のパッキングを必要とする BMP ファイルで使用されるデータ構造がいくつかあります。

于 2013-09-10T11:00:00.607 に答える