自分の学習効果のために、Cで共通のデータ構造を独自に実装しようとしています。私の現在の努力はベクトルであり、単一の任意の型(または少なくとも型のサイズを保持することができるようにしたいが、それはCの中で本当に重要なものすべてではない)。任意の型ポインタへのvoidポインタのキャスト
struct vector
{
void *item;
size_t element_size;
size_t num_elements;
}
は、しかし、私が理解していないことはタイプが任意であることになっている場合、私は*アイテムの配列内の特定の要素を参照することができる方法で次のように私の構造体があります。私はelement_sizeを知っていますが、voidは型ではないので、これはインデックスの参照に役立ちません(item [5]など)。私は、要素をバイトオフセットとして参照するのが最も簡単だと考えました。したがって、サイズ12の構造体のベクトルを保持していた場合、item [5]はitem *から12 * 5 = 60バイトになります。しかし、私はそのデータを取得する方法を理解していません。私はitem + 60から12バイトを欲しいと知っていますが、コンパイラはそれをどのように理解するのでしょうか?私はプリプロセッサ領域に入っていますか?
型を指定すると、 'element_size'の正しい値を簡単に見つけることができますか? (私は整列の必要条件を考えています) – NPE
@aix:型が与えられた場合、 'element_size'は' sizeof(type) 'です:オブジェクトのサイズには、整列に必要なパディングが既に含まれています。アライメントは 'item'によって指されたメモリがどのように割り当てられたかによって決まります。 'malloc(element_size * num_elements) 'で割り振られていれば(乗算はオーバーフローしません)、' malloc'はすべてのオブジェクトに合わせてメモリを返すように保証されているので、整列の問題はありません。 SIMD命令のためのスーパーサイズの型は、実装によってはしばしば除外されるので、私はsnigger quotesを使用します。 –
@aix、 'sizeof'演算子は、位置合わせを考慮に入れます。たとえば、 'long'が4バイトのアラインメントを持っている場合、' long'と 'char'を含む' struct'に 'sizeof'が適用されます。 – Lindydancer