C では、配列のインデックス付けには、ベース アドレスに個々の要素のコンパイル時の定数サイズを掛けることが含まれます。そのため、組み込みの配列サポートを「構造体ハック」で直接使用することはできません。各s
要素は、要求した 1 バイトに正確に割り当てられ、構造体のさらに先のインデックスS
が配列内の次の要素にアクセスする (またはオフになる) ためです。完全に終了し、クラッシュする可能性があります)。
キャッシュアクセス速度のために連続したデータが本当に必要な場合は、自分でパックすることができます。これは(ほとんどのものと同様に)間接的に解決できます...の連続した配列を持ち、S*
データを別の連続したバッファ(malloc()
またはすべてのメンバーS
の実際のデータ サイズを含め、すべてのオブジェクトに十分なメモリをスタック割り当てします)。要素がアーキテクチャに対して最適 (適切) に配置されていないs[]
場合、パフォーマンスが低下する (または OS がクラッシュする)可能性があるため、インスタンス間で手動でパディングする必要がある場合があります。int len
S
S* index[100] char data[10000];
(S*)(data) --------------> S with 14-byte s[] using data[0]..[17]
(S*)(data + 20) -----\ 2 byte padding so next S is 4-byte aligned
(S*)(data + 32) --\ \---> S with 7-byte s[] using data[20]..[30]
\ 1 byte padding...
\-----> ...
s
残念ながら、これは非常に柔軟性のないデータ レイアウトです。他のすべてのデータを邪魔にならないようにシャッフルしてインデックスにパッチを適用せずに要素のメンバーのデータ量を増やすことはできませんが、これは配列では正常なことです。それらを使用すると、おそらくこれがあなたに合うでしょう。もう1つの面倒は、構造体の合計サイズS
(およびパディングを含むs[]
)を前もって計算することです....