1 つの malloc() ブロックを使用して、さまざまな型の複数の構造体を格納しようとしています。メンバーは、デモンストレーションを目的とした架空のものです。完全な (C コンパイラーによって完全に認識され、定義されている) 完全に正当な C 構造体を構成することを除いて、それらの型、順序などについて仮定を立てることはできません。今回はこれで、次はあれです。私はコンセプトを追求しています。独自のミックスを作成しますが、考え方は同じでなければなりません - ヘッダー構造体には他の構造体へのポインターがあります。
typedef struct
{
int a;
} s1_t;
typedef struct
{
int b;
} s2_t;
typedef struct
{
int c;
} s3_t;
typedef struct
{
s1_t* s1;
s2_t* s2;
s3_t* s3;
} hdr_t;
int
main( int argc, char* argv[] )
{
void* mem = malloc( sizeof( hdr_t ) +
sizeof( s1_t ) +
sizeof( s2_t ) +
sizeof( s3_t ) );
hdr_t hdr = ( hdr_t* )mem;
hdr->s1 = (s1_t* ) ( hdr + sizeof( hdr ) );
hdr->s2 = (s2_t* ) ( hdr->s1 + sizeof( s1_t ) );
hdr->s3 = (s3_t* ) ( hdr->s2 + sizeof( s2_t ) );
/* etc. */
}
上記の (素朴な) コードは、小さな malloc でヒープを断片化するのではなく、(キーボード時に認識される) セット全体に対して 1 つのブロックを取得することを望んでいます。
質問: 可能な限りポータブルなソリューションを得るには、スキーム内の構造体を手動で整列する必要がありますか?
つまり、(疑似コード)、ALSZ = このチップのアライメント サイズ:
mem = malloc( hdrsz + ALSZ + s1sz + ALSZ + s2sz + ALSZ + s3sz );
hdr = ( hdr_t* )hdr;
s1 = align( hdr + sizeof( hdr_t ), ALSZ );
s2 = align( s1 + sizeof( s1 ), ALSZ );
s3 = align( s2 + sizeof( s2 ), ALSZ );
align( mem,boundary ) は、アラインされたアドレスを計算するための私のルーチンです。
ご感想ありがとうございます。