尝试使用一个 malloc()ed 块在其中存储多个不同类型的结构。成员出于演示目的是虚构的。不能对它们的类型、顺序等做出任何假设,除非它们构成了完全合法的 C 结构(完全为 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 将堆碎片化,而是为整个(在键盘时间已知)集合获得一个块。
问题:对于尽可能便携的解决方案,我是否必须在我的方案中手动对齐结构?
换句话说,我是否需要(伪代码),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) 是我计算对齐地址的例程。
谢谢你的想法。